]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - EVGEN/AliOmegaDalitz.cxx
Overlaps corrected, new shape of sectors
[u/mrichter/AliRoot.git] / EVGEN / AliOmegaDalitz.cxx
index c5224352231a30de549e97bcb507c1a8e81988b4..7d59b45e6c05cbb0ad2873f8179bead075c1dc5a 100644 (file)
@@ -48,7 +48,9 @@ ClassImp(AliOmegaDalitz)
 //
 AliOmegaDalitz::AliOmegaDalitz():
        AliDecayer(),
-       fLPMass(0)
+        fEPMass(0),
+       fMPMass(0),
+       fInit(0)
 {
     // Constructor
 }
@@ -56,58 +58,72 @@ AliOmegaDalitz::AliOmegaDalitz():
 void AliOmegaDalitz::Init()
 {
   // Initialisation
-  Int_t    ibin, nbins = 1000;
+  Int_t    idecay, ibin, nbins = 1000;
   Double_t min, max, binwidth;
-  Double_t pmass, lmass, omass;
+  Double_t pmass, lmass, omass, emass, mmass;
   Double_t epsilon, delta, mLL, q, kwHelp, krollWada, formFactor, weight;
 
   // Get the particle masses
   // electron
-  lmass = (TDatabasePDG::Instance()->GetParticle(kElectron))->Mass();
+  emass = (TDatabasePDG::Instance()->GetParticle(kElectron))->Mass();
+  // muon
+  mmass = (TDatabasePDG::Instance()->GetParticle(kMuonPlus))->Mass();
   // omega
   pmass = (TDatabasePDG::Instance()->GetParticle(223))      ->Mass();
   // pi0
   omass = (TDatabasePDG::Instance()->GetParticle(kPi0))     ->Mass();
 
-  min = 2.0 * lmass;
-  max = pmass - omass;
-  binwidth = (max - min) / (Double_t)nbins;
-  fLPMass = new TH1F("fLPMass", "Dalitz", nbins, min, max);
-
-  epsilon = (lmass / pmass) * (lmass / pmass);
-  delta   = (omass / pmass) * (omass / pmass);
-
-  for ( ibin = 1; ibin <= nbins; ibin++ )
+  for ( idecay = 1; idecay<=2; idecay++ )
   {
-    mLL = min + (Double_t)(ibin - 1) * binwidth + binwidth / 2.0;
-    q    = (mLL / pmass) * (mLL / pmass);
-    if ( q <= 4.0 * epsilon )
+    if ( idecay == 1 ) 
+      lmass = emass;
+    else
+      lmass = mmass;
+
+    min = 2.0 * lmass;
+    max = pmass - omass;
+    binwidth = (max - min) / (Double_t)nbins;
+    if ( idecay == 1 ) 
+      fEPMass = new TH1F("fEPMass", "Dalitz electron pair", nbins, min, max);
+    else
+      fMPMass = new TH1F("fMPMass", "Dalitz muon pair", nbins, min, max);
+
+    epsilon = (lmass / pmass) * (lmass / pmass);
+    delta   = (omass / pmass) * (omass / pmass);
+
+    for ( ibin = 1; ibin <= nbins; ibin++ )
     {
+      mLL = min + (Double_t)(ibin - 1) * binwidth + binwidth / 2.0;
+      q    = (mLL / pmass) * (mLL / pmass);
+      if ( q <= 4.0 * epsilon )
+      {
        AliFatal("Error in calculating Dalitz mass histogram binning!");
-       fLPMass = 0;
-    }  
+      }        
 
-    kwHelp = (1.0 + q /  (1.0 - delta)) * (1.0 + q / (1.0 - delta))
-            - 4.0 * q / ((1.0 - delta) * (1.0 - delta));    
-    if ( kwHelp <= 0.0 )
-    {
+      kwHelp = (1.0 + q /  (1.0 - delta)) * (1.0 + q / (1.0 - delta))
+             - 4.0 * q / ((1.0 - delta) * (1.0 - delta));    
+      if ( kwHelp <= 0.0 )
+      {
        AliFatal("Error in calculating Dalitz mass histogram binning!");
-       fLPMass = 0;
-    }  
-    krollWada = (2.0 / mLL) * TMath::Exp(1.5 * TMath::Log(kwHelp))
-                            * TMath::Sqrt(1.0 - 4.0 * epsilon / q)   
-                            * (1.0 + 2.0 * epsilon / q);
-    formFactor = 
+      }        
+      krollWada = (2.0 / mLL) * TMath::Exp(1.5 * TMath::Log(kwHelp))
+                              * TMath::Sqrt(1.0 - 4.0 * epsilon / q)   
+                              * (1.0 + 2.0 * epsilon / q);
+      formFactor = 
        (TMath::Power(TMath::Power(0.6519,2),2)) 
        / (TMath::Power(TMath::Power(0.6519,2)-TMath::Power(mLL, 2), 2) 
           + TMath::Power(0.04198, 2)*TMath::Power(0.6519, 2));
-    weight = krollWada * formFactor;   
-    fLPMass->AddBinContent(ibin, weight);
+      weight = krollWada * formFactor;   
+      if ( idecay == 1 ) 
+       fEPMass->AddBinContent(ibin, weight);
+      else
+       fMPMass->AddBinContent(ibin, weight);
+    }
   }
 }
 
 
-void AliOmegaDalitz::Decay(Int_t /*idpart*/, TLorentzVector* pparent)
+void AliOmegaDalitz::Decay(Int_t idlepton, TLorentzVector* pparent)
 {
 //-----------------------------------------------------------------------------
 //
@@ -115,31 +131,38 @@ void AliOmegaDalitz::Decay(Int_t /*idpart*/, TLorentzVector* pparent)
 //
 //-----------------------------------------------------------------------------
 
+    if (!fInit) {
+       Init();
+       fInit=1;
+    }
+    
   Double_t pmass, lmass, omass, lpmass;
   Double_t e1, p1, e3, p3;
-  Double_t betaSquare, lambda;
   Double_t costheta, sintheta, cosphi, sinphi, phi;
   
   // Get the particle masses
-  // electron
-  lmass = (TDatabasePDG::Instance()->GetParticle(kElectron))->Mass();
+  // lepton
+  lmass = (TDatabasePDG::Instance()->GetParticle(idlepton))->Mass();
   // omega
-  pmass = (TDatabasePDG::Instance()->GetParticle(223))      ->Mass();
+  pmass = pparent->M();
   // pi0
   omass = (TDatabasePDG::Instance()->GetParticle(kPi0))     ->Mass();
 
   // Sample the lepton pair mass from a histogram
   for( ;; ) 
   {
-      lpmass = fLPMass->GetRandom();
-      if ( pmass - omass > lpmass && lpmass / 2. > lmass ) break;
+    if ( idlepton == kElectron )
+      lpmass = fEPMass->GetRandom();
+    else
+      lpmass = fMPMass->GetRandom();
+    if ( pmass - omass > lpmass && lpmass / 2. > lmass ) break;
   }
   
   // lepton pair kinematics in virtual photon rest frame
   e1 = lpmass / 2.;
   p1 = TMath::Sqrt((e1 + lmass) * (e1 - lmass));
-  betaSquare = 1.0 - 4.0 * (lmass * lmass) / (lpmass * lpmass);
-  lambda      = betaSquare / (2.0 - betaSquare);
+  // betaSquare = 1.0 - 4.0 * (lmass * lmass) / (lpmass * lpmass);
+  // lambda      = betaSquare / (2.0 - betaSquare);
   costheta = (2.0 * gRandom->Rndm()) - 1.;
   sintheta = TMath::Sqrt((1. + costheta) * (1. - costheta));
   phi      = 2.0 * TMath::ACos(-1.) * gRandom->Rndm();
@@ -204,14 +227,19 @@ void AliOmegaDalitz::Decay(Int_t /*idpart*/, TLorentzVector* pparent)
 Int_t AliOmegaDalitz::ImportParticles(TClonesArray *particles)
 {
     // Import TParticles in array particles
-    // e+ e- pi0
+    // l+ l- pi0
     
     TClonesArray &clonesParticles = *particles;
 
-    Int_t pdg   [3] = {kPi0, kElectron, -kElectron};
-    Int_t parent[3] = {-1, 0, 0};
-    Int_t d1    [3] = {1, -1, -1};
-    Int_t d2    [3] = {2, -1, -1};
+    Int_t pdg   [3] = {kElectron, -kElectron, kPi0};
+    if ( fProducts[1].M() > 0.001 ) 
+    {  
+      pdg[0] =  kMuonPlus;
+      pdg[1] = -kMuonPlus;
+    }
+    Int_t parent[3] = {0, 0, -1};
+    Int_t d1    [3] = {-1, -1, 1};
+    Int_t d2    [3] = {-1, -1, 2};
     for (Int_t i = 2; i > -1; i--) {
        Double_t px = fProducts[i].Px();
        Double_t py = fProducts[i].Py();
@@ -224,11 +252,11 @@ Int_t AliOmegaDalitz::ImportParticles(TClonesArray *particles)
 }
 
 
-
 void AliOmegaDalitz::
 Rot(Double_t pin[3], Double_t pout[3], Double_t costheta, Double_t sintheta,
-    Double_t cosphi, Double_t sinphi)
+    Double_t cosphi, Double_t sinphi) const
 {
+// Perform rotation
   pout[0] = pin[0]*costheta*cosphi-pin[1]*sinphi+pin[2]*sintheta*cosphi;
   pout[1] = pin[0]*costheta*sinphi+pin[1]*cosphi+pin[2]*sintheta*sinphi;
   pout[2] = -1.0  * pin[0] * sintheta + pin[2] * costheta;
@@ -255,9 +283,13 @@ void AliOmegaDalitz::Decay(TClonesArray* array)
 
     for (Int_t j = 0; j < 3; j++) dp[j] = (TParticle*) (array->At(fd+j));
     if ((dp[0]->GetPdgCode() != kPi0) ||
-       (TMath::Abs(dp[1]->GetPdgCode()) != kElectron)) continue;
+       ((TMath::Abs(dp[1]->GetPdgCode()) != kElectron) &&
+        (TMath::Abs(dp[1]->GetPdgCode()) != kMuonPlus))) continue;
     TLorentzVector omega(part->Px(), part->Py(), part->Pz(), part->Energy());
-    Decay(223, &omega);
+    if ( TMath::Abs(dp[1]->GetPdgCode()) == kElectron ) 
+      Decay(kElectron, &omega);
+    else
+      Decay(kMuonPlus, &omega);
     for (Int_t j = 0; j < 3; j++) dp[j]->SetMomentum(fProducts[2-j]);
     printf("original %13.3f %13.3f %13.3f %13.3f \n", 
           part->Px(), part->Py(), part->Pz(), part->Energy());
@@ -287,7 +319,9 @@ void AliOmegaDalitz::Copy(TObject&) const
 
 AliOmegaDalitz::AliOmegaDalitz(const AliOmegaDalitz &dalitz)
   : AliDecayer(),
-    fLPMass(0)
+    fEPMass(0),
+    fMPMass(0),
+    fInit(0)
 {
   // Copy constructor
   dalitz.Copy(*this);