]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - RALICE/AliCollider.cxx
Bug fix in the check the point on the boundary in FindTPCRatSegment
[u/mrichter/AliRoot.git] / RALICE / AliCollider.cxx
index 87f05f30e91a862f0c4b5b4f4288f7fd7492bf8f..97e9b54694b66558b4239105382aad26f36dc696 100644 (file)
@@ -13,7 +13,7 @@
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
 
-// $Id: AliCollider.cxx,v 1.9 2004/01/12 08:23:22 nick Exp $
+// $Id: AliCollider.cxx,v 1.12 2004/05/04 15:33:04 nick Exp $
 
 ///////////////////////////////////////////////////////////////////////////
 // Class AliCollider
@@ -42,7 +42,7 @@
 //
 //  gen->SetOutputFile("test.root");
 //  gen->SetVertexMode(3);    
-//  gen->SetResolution(1e-4); // 1 micron vertex resolution
+//  gen->SetResolution(1e-6); // 1 micron vertex resolution
 //
 //  gen->SetRunNumber(1);
 //
 //
 //
 //--- Author: Nick van Eijndhoven 22-nov-2002 Utrecht University
-//- Modified: NvE $Date: 2004/01/12 08:23:22 $ Utrecht University
+//- Modified: NvE $Date: 2004/05/04 15:33:04 $ Utrecht University
 ///////////////////////////////////////////////////////////////////////////
 
+#include <cstdlib>
 #include "AliCollider.h"
 #include "Riostream.h"
  
@@ -120,11 +121,25 @@ AliCollider::AliCollider() : TPythia6()
 {
 // Default constructor.
 // All variables initialised to default values.
+//
+// Some Pythia default MC parameters are automatically modified to provide
+// more suitable running conditions for soft processes in view of
+// nucleus-nucleus interactions and astrophysical processes.
+// The user may initialise the generator with all the default Pythia
+// parameters and obtain full user control to modify the settings by means
+// of the SetUserControl memberfunction.
+//
+// Refer to the SetElastic memberfunction for the inclusion of elastic
+// and diffractive processes.
+// By default these processes are not included.
+
  fVertexmode=0;    // No vertex structure creation
- fResolution=1e-5; // Standard resolution is 0.1 micron
+ fResolution=1e-7; // Standard resolution is 0.1 micron
  fRunnum=0;
  fEventnum=0;
  fPrintfreq=1;
+ fUserctrl=0; // Automatic optimisation of some MC parameters 
+ fElastic=0;  // No elastic and diffractive processes
 
  fEvent=0;
 
@@ -258,7 +273,7 @@ void AliCollider::SetVertexMode(Int_t mode)
  }
 }
 ///////////////////////////////////////////////////////////////////////////
-Int_t AliCollider::GetVertexMode()
+Int_t AliCollider::GetVertexMode() const
 {
 // Provide the current mode for vertex structure creation.
  return fVertexmode;
@@ -266,16 +281,16 @@ Int_t AliCollider::GetVertexMode()
 ///////////////////////////////////////////////////////////////////////////
 void AliCollider::SetResolution(Double_t res)
 {
-// Set the resolution (in cm) for resolving (sec.) vertices.
+// Set the resolution (in meter) for resolving (sec.) vertices.
 // By default this resolution is set to 0.1 micron.
 // Note : In case no vertex creation has been selected, the value of
 //        the resolution is totally irrelevant.
  fResolution=fabs(res);
 }
 ///////////////////////////////////////////////////////////////////////////
-Double_t AliCollider::GetResolution()
+Double_t AliCollider::GetResolution() const
 {
-// Provide the current resolution (in cm) for resolving (sec.) vertices.
+// Provide the current resolution (in meter) for resolving (sec.) vertices.
  return fResolution;
 }
 ///////////////////////////////////////////////////////////////////////////
@@ -286,7 +301,7 @@ void AliCollider::SetRunNumber(Int_t run)
  fRunnum=run;
 }
 ///////////////////////////////////////////////////////////////////////////
-Int_t AliCollider::GetRunNumber()
+Int_t AliCollider::GetRunNumber() const
 {
 // Provide the user defined run number.
  return fRunnum;
@@ -299,24 +314,82 @@ void AliCollider::SetPrintFreq(Int_t n)
  fPrintfreq=n;
 }
 ///////////////////////////////////////////////////////////////////////////
-Int_t AliCollider::GetPrintFreq()
+Int_t AliCollider::GetPrintFreq() const
 {
 // Provide the user selected print frequency.
  return fPrintfreq;
 }
 ///////////////////////////////////////////////////////////////////////////
+void AliCollider::SetUserControl(Int_t flag)
+{
+// Set the user control flag w.r.t. disabling automatic optimisation
+// of some Pythia default MC parameters for soft interactions in view of
+// nucleus-nucleus collisions and astrophysical processes.
+// Flag = 0 : Limited user control (automatic optimisation enabled)
+//        1 : Full user control (automatic optimisation disabled)
+// By default the user control is set to 0 (i.e. automatic optimisation).
+// See the Init() memberfunctions for further details w.r.t. the optimisations.
+ fUserctrl=flag;
+}
+///////////////////////////////////////////////////////////////////////////
+Int_t AliCollider::GetUserControl() const
+{
+// Provide the value of the user control flag.
+ return fUserctrl;
+}
+///////////////////////////////////////////////////////////////////////////
+void AliCollider::SetElastic(Int_t flag)
+{
+// Set the flag w.r.t. inclusion of elastic and diffractive processes.
+// By default these processes are not included.
+// Flag = 0 : Do not include elastic and diffractive processes
+//        1 : Elastic and diffractive processes will be included
+ fElastic=flag;
+}
+///////////////////////////////////////////////////////////////////////////
+Int_t AliCollider::GetElastic() const
+{
+// Provide the value of the control flag for elastic and diffractive processes.
+ return fElastic;
+}
+///////////////////////////////////////////////////////////////////////////
 void AliCollider::Init(char* frame,char* beam,char* target,Float_t win)
 {
 // Initialisation of the underlying Pythia generator package.
+// The event number is reset to 0.
 // This routine just invokes TPythia6::Initialize(...) and the arguments
 // have the corresponding meaning.
-// The event number is reset to 0.
+// Some Pythia default MC parameters are automatically modified to provide
+// more suitable running conditions for soft processes in view of
+// astrophysical processes.
+// The optimisations consist of : 
+// * Usage of real photons for photon beams or targets
+// * Minimum CMS energy of 3 GeV for the event
+// * Activation of the default K factor values
+//   with separate settings for ordinary and color annihilation graphs.
+// The user may initialise the generator with all the default Pythia
+// parameters and obtain full user control to modify the settings by means
+// of invoking the SetUserControl memberfunction before this initialisation.
+// Note that the inclusion of elastic and diffractive processes is controlled
+// by invokation of the SetElastic memberfunction before this initialisation,
+// irrespective of the UserControl selection.
+
+ if (!fUserctrl) // Optimisation of some MC parameters
+ {
+  SetMSTP(14,10); // Real photons for photon beams or targets
+  SetPARP(2,3.);  // Minimum CMS energy for the event
+  SetMSTP(33,2);  // Activate K factor. Separate for ordinary and color annih. graphs
+ }
+
+ if (fElastic) SetMSEL(2); // Include low-Pt, elastic and diffractive events
+
  fEventnum=0;
  fNucl=0;
  fFrame=frame;
  fWin=win;
  Initialize(frame,beam,target,win);
 
+ cout << endl;
  cout << " *AliCollider::Init* Standard Pythia initialisation." << endl;
  cout << " Beam particle : " << beam << " Target particle : " << target
       << " Frame = " << frame << " Energy = " << win
@@ -327,13 +400,35 @@ void AliCollider::Init(char* frame,Int_t zp,Int_t ap,Int_t zt,Int_t at,Float_t w
 {
 // Initialisation of the underlying Pythia generator package for the generation
 // of nucleus-nucleus interactions.
+// The event number is reset to 0.
 // In addition to the Pythia standard arguments 'frame' and 'win', the user
 // can specify here (Z,A) values of the projectile and target nuclei.
 //
 // Note : The 'win' value denotes either the cms energy per nucleon-nucleon collision
 //        (i.e. frame="cms") or the momentum per nucleon in all other cases.
 //
-// The event number is reset to 0.
+// Some Pythia default MC parameters are automatically modified to provide
+// more suitable running conditions for soft processes in view of
+// nucleus-nucleus interactions and astrophysical processes.
+// The optimisations consist of : 
+// * Minimum CMS energy of 3 GeV for the event
+// * Activation of the default K factor values
+//   with separate settings for ordinary and color annihilation graphs.
+// The user may initialise the generator with all the default Pythia
+// parameters and obtain full user control to modify the settings by means
+// of invoking the SetUserControl memberfunction before this initialisation.
+// Note that the inclusion of elastic and diffractive processes is controlled
+// by invokation of the SetElastic memberfunction before this initialisation,
+// irrespective of the UserControl selection.
+
+ if (!fUserctrl) // Optimisation of some MC parameters
+ {
+  SetPARP(2,3.);  // Minimum CMS energy for the event
+  SetMSTP(33,2);  // Activate K factor. Separate for ordinary and color annih. graphs
+ }
+
+ if (fElastic) SetMSEL(2); // Include low-Pt, elastic and diffractive events
+
  fEventnum=0;
  fNucl=1;
  fFrame=frame;
@@ -349,6 +444,7 @@ void AliCollider::Init(char* frame,Int_t zp,Int_t ap,Int_t zt,Int_t at,Float_t w
 
  if (ap<1 || at<1 || zp>ap || zt>at)
  {
+  cout << endl;
   cout << " *AliCollider::Init* Invalid input value(s). Zproj = " << zp
        << " Aproj = " << ap << " Ztarg = " << zt << " Atarg = " << at << endl;
   return;
@@ -359,6 +455,7 @@ void AliCollider::Init(char* frame,Int_t zp,Int_t ap,Int_t zt,Int_t at,Float_t w
  fZtarg=zt;
  fAtarg=at;
 
+ cout << endl;
  cout << " *AliCollider::Init* Nucleus-Nucleus generator initialisation." << endl;
  cout << " Zproj = " << zp << " Aproj = " << ap << " Ztarg = " << zt << " Atarg = " << at
       << " Frame = " << frame << " Energy = " << win
@@ -607,8 +704,24 @@ void AliCollider::MakeEvent(Int_t npt,Int_t mlist,Int_t medit)
    select=IsSelected();
    if (select) fSelect=1;
 
-   if (first) // Store projectile and target information in the event structure
+   if (first) // Store generator parameter information in the event structure
    {
+    // Enter generator parameters as a device in the event
+    AliSignal params;
+    params.SetNameTitle("AliCollider","AliCollider generator parameters");
+    params.SetSlotName("Medit",1);
+    params.SetSlotName("Vertexmode",2);
+    params.SetSlotName("Resolution",3);
+    params.SetSlotName("Userctrl",4);
+    params.SetSlotName("Elastic",5);
+
+    params.SetSignal(medit,1);
+    params.SetSignal(fVertexmode,2);
+    params.SetSignal(fResolution,3);
+    params.SetSignal(fUserctrl,4);
+    params.SetSignal(fElastic,5);
+
+    // Store projectile and target information in the event structure
     if (fNucl)
     {
      v[0]=GetP(1,1);
@@ -623,6 +736,22 @@ void AliCollider::MakeEvent(Int_t npt,Int_t mlist,Int_t medit)
      ptarg.SetVector(v,"car");
      pnucl=ptarg.GetNorm();
      fEvent->SetTarget(fAtarg,fZtarg,pnucl);
+
+     params.AddNamedSlot("specmode");
+     params.AddNamedSlot("Specpmin");
+     params.AddNamedSlot("npart");
+     params.AddNamedSlot("ncolpp");
+     params.AddNamedSlot("ncolnp");
+     params.AddNamedSlot("ncolpn");
+     params.AddNamedSlot("ncolnn");
+
+     params.SetSignal(specmode,"specmode");
+     params.SetSignal(fSpecpmin,"Specpmin");
+     params.SetSignal(npt,"npart");
+     params.SetSignal(ncols[0],"ncolpp");
+     params.SetSignal(ncols[1],"ncolnp");
+     params.SetSignal(ncols[2],"ncolpn");
+     params.SetSignal(ncols[3],"ncolnn");
     }
     else
     {
@@ -639,12 +768,19 @@ void AliCollider::MakeEvent(Int_t npt,Int_t mlist,Int_t medit)
      kf=GetK(2,2);
      fEvent->SetTarget(0,0,pnucl,kf);
     }
+
+    fEvent->AddDevice(params);
+
     first=0;
    }
 
    if (medit >= 0) Pyedit(medit); // Define which particles are to be kept
 
-   if (mlist>=0 && select) Pylist(mlist);
+   if (mlist>=0 && select)
+   {
+    Pylist(mlist);
+    cout << endl;
+   }
 
    npart=GetN();
    for (Int_t jpart=1; jpart<=npart; jpart++)
@@ -660,10 +796,10 @@ void AliCollider::MakeEvent(Int_t npt,Int_t mlist,Int_t medit)
     v[2]=GetP(jpart,3);
     p.SetVector(v,"car");
 
-    // Production location in cm.
-    v[0]=GetV(jpart,1)/10;
-    v[1]=GetV(jpart,2)/10;
-    v[2]=GetV(jpart,3)/10;
+    // Production location in meter.
+    v[0]=GetV(jpart,1)/1000.;
+    v[1]=GetV(jpart,2)/1000.;
+    v[2]=GetV(jpart,3)/1000.;
     r.SetPosition(v,"car");
 
     ntk++;
@@ -867,12 +1003,20 @@ void AliCollider::MakeEvent(Int_t npt,Int_t mlist,Int_t medit)
  }
 }
 
- if (mlist && !(fEventnum%fPrintfreq)) cout << endl; // Create empty output line after the event
+ if (!(fEventnum%fPrintfreq) && (mlist || fEvent))
+ {
+  if (fEvent)
+  {
+   cout << " Number of tracks in the event structure : "
+        << fEvent->GetNtracks() << endl;
+  }
+  cout << endl; // Create empty output line after the event
+ }
 
  if (fOutTree && fSelect) fOutTree->Fill();
 }
 ///////////////////////////////////////////////////////////////////////////
-AliEvent* AliCollider::GetEvent(Int_t select)
+AliEvent* AliCollider::GetEvent(Int_t select) const
 {
 // Provide pointer to the generated event structure.
 //
@@ -1007,7 +1151,7 @@ void AliCollider::SelectEvent(Int_t id)
  }
 }
 ///////////////////////////////////////////////////////////////////////////
-Int_t AliCollider::GetSelectionFlag()
+Int_t AliCollider::GetSelectionFlag() const
 {
 // Return the value of the selection flag for the total event.
 // When the event passed the selection criteria as specified via
@@ -1060,7 +1204,7 @@ void AliCollider::SetSpectatorPmin(Float_t pmin)
  fSpecpmin=pmin;
 }
 ///////////////////////////////////////////////////////////////////////////
-Float_t AliCollider::GetSpectatorPmin()
+Float_t AliCollider::GetSpectatorPmin() const
 {
 // Provide the minimal spectator momentum in GeV/c.
  return fSpecpmin;