]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - EVGEN/AliGenHaloProtvino.cxx
Field conversion factor added.
[u/mrichter/AliRoot.git] / EVGEN / AliGenHaloProtvino.cxx
index d7a88d9862ff3502929059da6d878e77b603f743..412376b10bb1eb337ffd9679cb709b423f834a19 100644 (file)
 
 /*
 $Log$
+Revision 1.8.4.1  2002/07/24 08:56:28  alibrary
+Updating EVGEN on TVirtulaMC
+
+Revision 1.10  2002/05/28 14:28:12  morsch
+Correct LHC nominal current profile (1st year 20%, 2nd year 30%, 3rd year 100 %)
+
+Revision 1.9  2002/05/28 13:49:17  morsch
+- Udates for new pressure table
+- calculate time
+- first provisions for real events.
+
+Revision 1.8  2002/03/22 13:00:25  morsch
+Initialize sum to 0. (Jiri Chudoba).
+
+Revision 1.7  2002/02/21 16:09:45  morsch
+Move SetHighwaterMark() after last possible SetTrack()
+
+Revision 1.6  2002/02/01 15:28:22  morsch
+Fastidious print statements removed.
+
+Revision 1.5  2002/02/01 14:12:28  morsch
+Include new gas pressure estimates (LHC Pproject Note 273)
+
+Revision 1.4  2001/12/19 16:30:24  morsch
+Some bugs corrected and skip method added. (Rachid Guernane)
+
+Revision 1.3  2001/07/27 17:09:36  morsch
+Use local SetTrack, KeepTrack and SetHighWaterMark methods
+to delegate either to local stack or to stack owned by AliRun.
+(Piotr Skowronski, A.M.)
+
+Revision 1.2  2001/06/14 12:15:27  morsch
+Bugs corrected. SetSide() method added.
+
 Revision 1.1  2001/01/23 15:04:33  morsch
 Generator to read beam halo file from Protvino group.
 
@@ -32,6 +66,7 @@ Generator to read beam halo file from Protvino group.
 #include "AliPDG.h"
 
 #include <TDatabasePDG.h>
+#include <TSystem.h>
 #include <stdlib.h>
 
  ClassImp(AliGenHaloProtvino)
@@ -39,7 +74,6 @@ Generator to read beam halo file from Protvino group.
         :AliGenerator(-1)
 {
 // Constructor
-    printf("\n Calling Default Constructor");
     
     fName  = "HaloProtvino";
     fTitle = "Halo from LHC Tunnel";
@@ -48,19 +82,26 @@ Generator to read beam halo file from Protvino group.
     fNpart = -1;
     fFile  =  0;
     fSide  =  1;
+//
+    SetRunPeriod();
+    SetTimePerEvent();
+    SetAnalog(0);
 }
 
 AliGenHaloProtvino::AliGenHaloProtvino(Int_t npart)
     :AliGenerator(npart)
 {
 // Constructor
-    printf("\n Calling Constructor");
     fName = "Halo";
     fTitle= "Halo from LHC Tunnel";
 //
     fNpart   = npart;
     fFile    = 0;
     fSide    = 1;
+//
+    SetRunPeriod();
+    SetTimePerEvent();
+    SetAnalog(0);
 }
 
 AliGenHaloProtvino::AliGenHaloProtvino(const AliGenHaloProtvino & HaloProtvino)
@@ -85,6 +126,74 @@ void AliGenHaloProtvino::Init()
     } else {
        printf("\n Opening of file %s failed,  %p ! \n ",  fFileName.Data(), fFile);
     }
+//
+//
+//
+//    Read file with gas pressure values
+    char *name;
+    
+    name = gSystem->ExpandPathName("$(ALICE_ROOT)/LHC/gasPressure.dat" );
+    FILE* file = fopen(name, "r");
+    Float_t z;
+    Int_t i, j;
+    
+//
+//  Ring 1   
+// 
+    for (i = 0; i < 21; i++)
+    {
+       fscanf(file, "%f %f %f %f %f %f", &z, 
+              &fG1[i][0], &fG1[i][1], &fG1[i][2], &fG1[i][3], &fG1[i][4]);
+       if (i > 0) {
+           fZ1[i] = fZ1[i-1] + z;
+       } else {
+           fZ1[i] = 20.;
+       }
+  }
+//
+// Ring 2
+//
+    for (i = 0; i < 21; i++)
+    {
+       fscanf(file, "%f %f %f %f %f %f", &z, 
+              &fG2[i][0], &fG2[i][1], &fG2[i][2], &fG2[i][3], &fG2[i][4]);
+       if (i > 0) {
+           fZ2[i] = fZ2[i-1] + z;
+       } else {
+           fZ2[i] = 20.;
+       }
+    }
+//
+//  Transform into interaction rates
+//
+    const Float_t crossSection = 0.094e-28;     // m^2
+    Float_t pFlux[5] = {0.2, 0.2, 0.3, 0.3, 1.0};
+
+    for (j = 0; j <  5; j++) {
+       pFlux[j] *= 1.e11/25.e-9;
+       for (i = 0; i < 21; i++)  
+       {
+           fG1[i][j] = fG1[i][j] * crossSection * pFlux[j]; // 1/m/s 
+           fG2[i][j] = fG2[i][j] * crossSection * pFlux[j]; // 1/m/s
+       }
+    }
+    
+
+    Float_t sum1 = 0.;
+    Float_t sum2 = 0.;
+    
+    for (Int_t i = 0; i < 300; i++) {
+       Float_t z = 20.+i*1.;
+       z*=100;
+       Float_t wgt1 = GassPressureWeight(z);
+       Float_t wgt2 = GassPressureWeight(-z);
+//     printf("weight: %f %f %f %f %f \n", z, wgt1, wgt2, fZ1[20], fZ2[20]);
+       sum1 += wgt1;
+       sum2 += wgt2;
+    }
+    sum1/=250.;
+    sum2/=250.;
+    printf("\n %f %f \n \n", sum1, sum2);
 }
 
 //____________________________________________________________
@@ -95,86 +204,147 @@ void AliGenHaloProtvino::Generate()
   Float_t polar[3]= {0,0,0};
   Float_t origin[3];
   Float_t p[3], p0;
-  Float_t ekin, wgt, tx, ty, tz, txy;
-  Float_t zPrimary;
+  Float_t tz, txy;
   Float_t amass;
-  Int_t   inuc;
   //
-  Int_t ipart, ncols, nt;
+  Int_t ncols, nt;
+  Int_t nskip = 0;
   Int_t nread = 0;
+
+  Float_t* zPrimary = new Float_t [fNpart];
+  Int_t  * inuc     = new Int_t   [fNpart];
+  Int_t  * ipart    = new Int_t   [fNpart];
+  Float_t* wgt      = new Float_t [fNpart]; 
+  Float_t* ekin     = new Float_t [fNpart];
+  Float_t* vx       = new Float_t [fNpart];
+  Float_t* vy       = new Float_t [fNpart];
+  Float_t* tx       = new Float_t [fNpart];
+  Float_t* ty       = new Float_t [fNpart];
+  
+  Float_t zVertexOld = -1.e10;
+  Int_t   nInt       = 0;        // Counts number of interactions
+  
   while(1) {
+//
+// Load event into array
+//
       ncols = fscanf(fFile,"%f %d %d %f %f %f %f %f %f",
-                    &zPrimary, &inuc, &ipart, &wgt, 
-                    &ekin, &origin[0], &origin[1],
-                    &tx, &ty);
-/*
-      printf(" \n %f %d %d %f %f %f %f %f %f",
-                    zPrimary, inuc, ipart, wgt, 
-                    ekin, origin[0], origin[1],
-                    tx, ty);
-*/
+                    &zPrimary[nread], &inuc[nread], &ipart[nread], &wgt[nread], 
+                    &ekin[nread], &vx[nread], &vy[nread],
+                    &tx[nread], &ty[nread]);
+      
       if (ncols < 0) break;
+// Skip fNskip events
+      nskip++;
+      if (fNpart !=-1 && nskip <= fNskip) continue;
+// Count interactions
+      if (zPrimary[nread] != zVertexOld) {
+         nInt++;
+         zVertexOld = zPrimary[nread];
+      }
+// Count tracks      
       nread++;
-
       if (fNpart !=-1 && nread > fNpart) break;
-
-
-
-      amass = TDatabasePDG::Instance()->GetParticle(ipart)->Mass();
+  }
+//
+// Mean time between interactions
+//
+  Float_t dT = fTimePerEvent/nInt;   // sec 
+  Float_t t  = 0;                    // sec
+  
+//
+// Loop over primaries
+//
+  zVertexOld   = -1.e10;
+  Double_t arg = 0.;
+  
+  for (Int_t nprim = 0; nprim < fNpart; nprim++) 
+  {
+      amass = TDatabasePDG::Instance()->GetParticle(ipart[nprim])->Mass();
 
       //
       // Momentum vector
       //
-      p0=sqrt(ekin*ekin + 2.*amass);
+      p0=sqrt(ekin[nprim]*ekin[nprim] + 2.*amass*ekin[nprim]);
       
-      txy=TMath::Sqrt(tx*tx+ty*ty);
+      txy=TMath::Sqrt(tx[nprim]*tx[nprim]+ty[nprim]*ty[nprim]);
       if (txy == 1.) {
          tz=0;
       } else {
          tz=-TMath::Sqrt(1.-txy);
       }
     
-      p[0]=p0*tx;
-      p[1]=p0*ty;
-      p[2]=-p0*tz;
-
-      origin[2] = 21.965;
+      p[0] = p0*tx[nprim];
+      p[1] = p0*ty[nprim];
+      p[2] =-p0*tz;
+      
+      origin[0] = vx[nprim];
+      origin[1] = vy[nprim];
+      origin[2] = -2196.5;
 
       //
       //
       // Particle weight
 
       Float_t originP[3] = {0., 0., 0.};
-      originP[2] = zPrimary;
+      originP[2] = zPrimary[nprim];
       
       Float_t pP[3] = {0., 0., 0.};
       Int_t ntP;
       
       if (fSide == -1) {
-         originP[2] = -zPrimary;
+         originP[2] = -zPrimary[nprim];
          origin[2]  = -origin[2];
          p[2]       = -p[2];
       }
-      
-      gAlice->SetTrack(0,-1,kProton,pP,originP,polar,0,kPNoProcess,ntP);
-      gAlice->KeepTrack(ntP);
-      
-      
-      fParentWeight=wgt*GassPressureWeight(zPrimary);
-      gAlice->SetTrack(fTrackIt,ntP,ipart,p,origin,polar,0,kPNoProcess,nt,fParentWeight);
-      gAlice->SetHighWaterMark(nt);
-      
+
+      //
+      // Time
+      //
+      if (zPrimary[nprim] != zVertexOld) {
+         while(arg==0.) arg = gRandom->Rndm();
+         t -= dT*TMath::Log(arg);              // (sec)   
+         zVertexOld = zPrimary[nprim];
+      }
+
+//    Get statistical weight according to local gas-pressure
+//
+      fParentWeight=wgt[nprim]*GassPressureWeight(zPrimary[nprim]);
+
+      if (!fAnalog || gRandom->Rndm() < fParentWeight) {
+//    Pass parent particle
+//
+         SetTrack(0,-1,kProton,pP,originP,polar,t,kPNoProcess,ntP, fParentWeight);
+         KeepTrack(ntP);
+         SetTrack(fTrackIt,ntP,ipart[nprim],p,origin,polar,t,kPNoProcess,nt,fParentWeight);
+      }
+
       //
-      // Assume particles come from two directions with same probability
-
-      origin[2]=-origin[2];
-      p[2]=-p[2];
-      fParentWeight=wgt*GassPressureWeight(-zPrimary);
-      gAlice->SetTrack(fTrackIt,ntP,ipart,p,origin,polar,0,kPNoProcess,nt,fParentWeight);
-      origin[2]=-origin[2];
-      p[2]=-p[2];
-      origin[2]=-origin[2];
+      // Both sides are considered
+      //
+
+      if (fSide > 1) {
+         fParentWeight=wgt[nprim]*GassPressureWeight(-zPrimary[nprim]);
+         if (!fAnalog || gRandom->Rndm() < fParentWeight) {
+             origin[2]  = -origin[2];
+             originP[2] = -originP[2];
+             p[2]=-p[2];
+             SetTrack(0,-1,kProton,pP,originP,polar,t,kPNoProcess,ntP, fParentWeight);
+             KeepTrack(ntP);
+             SetTrack(fTrackIt,ntP,ipart[nprim],p,origin,polar,t,kPNoProcess,nt,fParentWeight);
+         }
+      }
+      SetHighWaterMark(nt);
   }
+  delete [] zPrimary;
+  delete [] inuc;    
+  delete [] ipart;   
+  delete [] wgt;     
+  delete [] ekin;    
+  delete [] vx;      
+  delete [] vy;      
+  delete [] tx;      
+  delete [] ty;      
 }
  
 
@@ -185,15 +355,40 @@ AliGenHaloProtvino& AliGenHaloProtvino::operator=(const  AliGenHaloProtvino& rhs
 }
 
 
+
 Float_t AliGenHaloProtvino::GassPressureWeight(Float_t zPrimary)
 {
-  // Return z-dependent gasspressure weight
-  //
-    Float_t weight = 500.;
-    
-    if (zPrimary > 45000.) weight = 2.e4;
-    
-  return weight;
+//
+// Return z-dependent gasspressure weight = interaction rate [1/m/s].
+//
+    Float_t weight = 0.;
+    zPrimary/=100.;        // m
+    Float_t zAbs = TMath::Abs(zPrimary);
+    if (zPrimary > 0.) 
+    {
+       if (zAbs > fZ1[20]) {
+           weight = 2.e4;
+       } else {
+           for (Int_t i = 1; i < 21; i++) {
+               if (zAbs < fZ1[i]) {
+                   weight = fG1[i][fRunPeriod];
+                   break;
+               }
+           }
+       }
+    } else {
+       if (zAbs > fZ2[20]) {
+           weight = 2.e4;
+       } else {
+           for (Int_t i = 1; i < 21; i++) {
+               if (zAbs < fZ2[i]) {
+                   weight = fG2[i][fRunPeriod];
+                   break;
+               }
+           }
+       }
+    }
+    return weight;
 }
 
 /*