Switch between Geant3 and Fluka introduced.
authorkowal2 <kowal2@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 16 Oct 2007 07:30:46 +0000 (07:30 +0000)
committerkowal2 <kowal2@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 16 Oct 2007 07:30:46 +0000 (07:30 +0000)
TPC/AliTPC.cxx
TPC/AliTPC.h
TPC/AliTPCv2.cxx

index 372e8fd2130e84ee473937767101d672dd507ec3..08537179af92771200838c6776483c3333cb4589 100644 (file)
@@ -92,10 +92,12 @@ ClassImp(AliTPC)
                   fHitType(0),
                   fDigitsSwitch(0),
                   fSide(0),
+                   fPrimaryIonisation(0),
                   fNoiseDepth(0),
                   fNoiseTable(0),
                   fCurrentNoise(0),
                   fActiveSectors(0)
+                   
 
 {
   //
@@ -123,10 +125,12 @@ AliTPC::AliTPC(const char *name, const char *title)
                   fHitType(0),
                   fDigitsSwitch(0),
                   fSide(0),
+                   fPrimaryIonisation(0),
                   fNoiseDepth(0),
                   fNoiseTable(0),
                   fCurrentNoise(0),
-                  fActiveSectors(0)
+                   fActiveSectors(0)
+                  
 {
   //
   // Standard constructor
index 3f07e51046b29aa3b648e764f9a71a38bd8077f4..8c151fea74e8d0d1985aa40373fbf6ccadbf707a 100644 (file)
@@ -95,7 +95,7 @@ public:
    Int_t GetHitType() const {return fHitType;}
    void    SetActiveSectors(Int_t flag=0); //loop over al hits and set active only hitted sectors
    Bool_t  TrackInVolume(Int_t id,Int_t track);  //return true if current track is in volume
-
+   void    SetPrimaryIonisation(Bool_t flag = kTRUE) {fPrimaryIonisation = flag;}
 // static functions
    static AliTPCParam* LoadTPCParam(TFile *file); 
 protected:
@@ -115,7 +115,7 @@ protected:
   //MK changes
 
   Float_t        fSide;  // selects left(-1), right(+1), or both(0) sides of the TPC
-   
+  Bool_t     fPrimaryIonisation; //switch between Fluka(true) and geant3(false)
  private:
   AliTPC(const AliTPC& t);
   AliTPC &operator = (const AliTPC & param);
@@ -136,6 +136,7 @@ protected:
   Float_t *  fNoiseTable;  //! table with noise
   Int_t      fCurrentNoise; //! index of the noise in  the noise table 
   Bool_t*    fActiveSectors; //! bool indicating which sectors are active
 
   ClassDef(AliTPC,12)  // Time Projection Chamber class
 };
@@ -160,7 +161,7 @@ public:
 
    Float_t Time() const {return fTime;}
  
-   ClassDef(AliTPChit,2)  // Time Projection Chamber hits
+   ClassDef(AliTPChit,3)  // Time Projection Chamber hits
 };
 
 
index d2d23e491f83aacdf2e1a635593cee65a41d31d8..fafc0f9eb0cf7765b185d37b24f0d6ce9e6237ef 100644 (file)
@@ -1179,7 +1179,7 @@ void AliTPCv2::StepManager()
   
   vol[1]=0; // preset row number to 0
   //
-  gMC->SetMaxStep(kbig);
+  if (fPrimaryIonisation) gMC->SetMaxStep(kbig);
   
   if(!gMC->IsTrackAlive()) return; // particle has disappeared
   
@@ -1274,8 +1274,14 @@ void AliTPCv2::StepManager()
   //  charged particle is in the sensitive drift volume
   //-----------------------------------------------------------------
   if(gMC->TrackStep() > 0) {
-
-    Int_t nel = (Int_t)(((gMC->Edep())-kpoti)/kwIon) + 1;
+    Int_t nel=0;
+    if (!fPrimaryIonisation) {
+      nel = (Int_t)(((gMC->Edep())-kpoti)/kwIon) + 1;
+    }
+    else {
+         Float_t edep = gMC->Edep();
+         if (edep > 0.) nel = (Int_t)((gMC->Edep()*1.5)/kwIon) + 1;      
+    }
     nel=TMath::Min(nel,300); // 300 electrons corresponds to 10 keV
     //
     gMC->TrackPosition(p);
@@ -1304,28 +1310,30 @@ void AliTPCv2::StepManager()
   
   Float_t pp;
   TLorentzVector mom;
-  gMC->TrackMomentum(mom);
-  Float_t ptot=mom.Rho();
-  Float_t betaGamma = ptot/gMC->TrackMass();
-  
-  Int_t pid=gMC->TrackPid();
-  if((pid==kElectron || pid==kPositron) && ptot > 0.002)
-    { 
-      pp = kprim*1.58; // electrons above 20 MeV/c are on the plateau!
-    }
-  else
-    {
+  // below is valid only for Geant3 (fPromaryIonisation not set)
+  if(!fPrimaryIonisation){
+    gMC->TrackMomentum(mom);
+    Float_t ptot=mom.Rho();
+    Float_t betaGamma = ptot/gMC->TrackMass();
 
-      betaGamma = TMath::Max(betaGamma,(Float_t)7.e-3); // protection against too small bg
-      pp=kprim*BetheBloch(betaGamma); 
+    Int_t pid=gMC->TrackPid();
+    if((pid==kElectron || pid==kPositron) && ptot > 0.002)
+      { 
+        pp = kprim*1.58; // electrons above 20 MeV/c are on the plateau!
+      }
+    else
+      {
+
+        betaGamma = TMath::Max(betaGamma,(Float_t)7.e-3); // protection against too small bg
+        pp=kprim*BetheBloch(betaGamma); 
    
-      if(TMath::Abs(charge) > 1.) pp *= (charge*charge);
+        if(TMath::Abs(charge) > 1.) pp *= (charge*charge);
     }
   
-  Double_t rnd = gMC->GetRandom()->Rndm();
-  
-  gMC->SetMaxStep(-TMath::Log(rnd)/pp);
+    Double_t rnd = gMC->GetRandom()->Rndm();
   
+    gMC->SetMaxStep(-TMath::Log(rnd)/pp);
+  }
   
 }