Take the absolute time of the hits into account in the digitization. Needed for pileu...
authorcblume <cblume@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 12 Apr 2007 09:00:59 +0000 (09:00 +0000)
committercblume <cblume@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 12 Apr 2007 09:00:59 +0000 (09:00 +0000)
TRD/AliTRD.cxx
TRD/AliTRD.h
TRD/AliTRDdigitizer.cxx
TRD/AliTRDgeometry.cxx
TRD/AliTRDhit.cxx
TRD/AliTRDhit.h
TRD/AliTRDtracker.cxx
TRD/AliTRDv0.cxx
TRD/AliTRDv1.cxx

index 983d8e3..1c565ab 100644 (file)
@@ -294,14 +294,21 @@ void AliTRD::Digits2Raw()
 
 //_____________________________________________________________________________
 void AliTRD::AddHit(Int_t track, Int_t det, Float_t *hits, Int_t q
-                  , Bool_t inDrift)
+                  , Float_t time, Bool_t inDrift)
 {
   //
   // Add a hit for the TRD
   // 
 
   TClonesArray &lhits = *fHits;
-  AliTRDhit *hit = new(lhits[fNhits++]) AliTRDhit(fIshunt,track,det,hits,q);
+  AliTRDhit *hit = new(lhits[fNhits++]) AliTRDhit(fIshunt
+                                                 ,track
+                                                 ,det
+                                                 ,hits
+                                                 ,q
+                                                 ,time);
+
+  printf("AliTRD::AddHit --- time = %f\n",time);
 
   if (inDrift) {
     hit->SetDrift();
index 6d3028d..ca509e2 100644 (file)
@@ -54,7 +54,8 @@ class AliTRD : public AliDetector {
   virtual void     MakeBranch(Option_t *option);
 
   virtual void     AddHit(Int_t, Int_t*, Float_t*)       { }; 
-  virtual void     AddHit(Int_t track, Int_t det, Float_t *hits, Int_t q, Bool_t inDrift); 
+  virtual void     AddHit(Int_t track, Int_t det, Float_t *hits
+                        , Int_t q, Float_t time, Bool_t inDrift); 
 
   virtual void     SetTreeAddress();
 
index 80ac0be..de16a45 100644 (file)
@@ -855,6 +855,7 @@ Bool_t AliTRDdigitizer::MakeDigits()
       pos[2]           = hit->Z();
       Int_t   track    = hit->Track();
       Int_t   detector = hit->GetDetector();
+      Float_t hittime  = hit->GetTime();
       Int_t   plane    = fGeo->GetPlane(detector);
       Int_t   chamber  = fGeo->GetChamber(detector);
       padPlane         = commonParam->GetPadPlane(plane,chamber);
@@ -934,7 +935,7 @@ Bool_t AliTRDdigitizer::MakeDigits()
         locT = locT - kDrWidth/2.0 - kAmWidth/2.0;
       } 
 
-      // The driftlength (w/o diffusion yet !).
+      // The driftlength [cm] (w/o diffusion yet !).
       // It is negative if the hit is between pad plane and anode wires.
       Double_t driftlength = -1.0 * locT;
 
@@ -1022,22 +1023,25 @@ Bool_t AliTRDdigitizer::MakeDigits()
         driftvelocity = calVdriftDetValue * calVdriftROC->GetValue(colE,rowE);
         Float_t t0    = calT0DetValue     + calT0ROC->GetValue(colE,rowE);
 
-        // Convert the position to drift time, using either constant drift velocity or
+        // Convert the position to drift time [mus], using either constant drift velocity or
         // time structure of drift cells (non-isochronity, GARFIELD calculation).
+       // Also add absolute time of hits to take pile-up events into account properly
        Double_t drifttime;
         if (simParam->TimeStructOn()) {
          // Get z-position with respect to anode wire
-          Double_t Z  =  row0 - locR + simParam->GetAnodeWireOffset();
-         Z -= ((Int_t)(2 * Z)) / 2.0;
-         if (Z > 0.25) {
-            Z  = 0.5 - Z;
+          Double_t zz  =  row0 - locR + simParam->GetAnodeWireOffset();
+         zz -= ((Int_t)(2 * zz)) / 2.0;
+         if (zz > 0.25) {
+            zz  = 0.5 - zz;
          }
          // Use drift time map (GARFIELD)
-          drifttime = TimeStruct(driftvelocity,0.5*kAmWidth-1.0*locT,Z);
+          drifttime = TimeStruct(driftvelocity,0.5*kAmWidth-1.0*locT,zz)
+                    + hittime;
         } 
         else {
          // Use constant drift velocity
-          drifttime = -1.0 * locT / driftvelocity;
+          drifttime = -1.0 * locT / driftvelocity
+                    + hittime;
         }
 
         // Apply the gas gain including fluctuations
index f62e225..1272906 100644 (file)
@@ -1422,7 +1422,6 @@ Int_t AliTRDgeometry::GetPadRowFromMCM(Int_t irob, Int_t imcm) const
 
   return fgkMCMrow*(irob/2) + imcm/fgkMCMrow;
 
-;
 }
 
 //_____________________________________________________________________________
index bf6a730..4ee565b 100644 (file)
@@ -30,6 +30,7 @@ AliTRDhit::AliTRDhit()
   :AliHit()
   ,fDetector(0)
   ,fQ(0)
+  ,fTime(0)
 {
   //
   // AliTRDhit default constructor
@@ -39,10 +40,11 @@ AliTRDhit::AliTRDhit()
 
 //_____________________________________________________________________________
 AliTRDhit::AliTRDhit(Int_t shunt, Int_t track, Int_t det
-                   , Float_t *hits, Int_t q)
+                   , Float_t *hits, Int_t q, Float_t time)
   :AliHit(shunt,track)
   ,fDetector((UShort_t) det)
   ,fQ((Short_t) q)
+  ,fTime(time)
 {
   //
   // Create a TRD hit
index ca1e2d6..81a60ee 100644 (file)
@@ -18,17 +18,19 @@ class AliTRDhit : public AliHit {
  public:
 
   AliTRDhit();
-  AliTRDhit(Int_t shunt, Int_t track, Int_t det, Float_t *hits, Int_t q);
+  AliTRDhit(Int_t shunt, Int_t track, Int_t det, Float_t *hits, Int_t q, Float_t time);
   virtual ~AliTRDhit();
 
           Int_t    GetDetector() const         { return fDetector; }
           Int_t    GetCharge() const           { return fQ;        }
+          Float_t  GetTime() const             { return fTime;     }
 
           void     SetX(Float_t x)             { fX        =   x;  }
           void     SetY(Float_t y)             { fY        =   y;  }
           void     SetZ(Float_t z)             { fZ        =   z;  }
           void     SetDetector(Int_t det)      { fDetector = det;  }
           void     SetQ(Int_t q)               { fQ        =   q;  }
+          void     SetTime(Float_t time)       { fTime     = time; }
 
           Bool_t   FromDrift() const           { return TestBit(kDrift);         }
           Bool_t   FromAmplification() const   { return TestBit(kAmplification); }
@@ -49,8 +51,9 @@ class AliTRDhit : public AliHit {
 
           UShort_t fDetector;               //  TRD detector number
           Short_t  fQ;                      //  Charge created by a hit. TR signals are negative.
+          Float_t  fTime;                   //  Absolute time of hit [mus]. Needed for pile-up events
 
-  ClassDef(AliTRDhit,3)                     //  Hit for the Transition Radiation Detector
+  ClassDef(AliTRDhit,4)                     //  Hit for the Transition Radiation Detector
 
 };
 
index 05d4103..50b3774 100644 (file)
@@ -379,9 +379,9 @@ Bool_t  AliTRDtracker::Transform(AliTRDcluster *cluster)
 
   cluster->SetY(cluster->GetY() - driftX*exB);
   Double_t xplane = (Double_t) AliTRDgeometry::GetTime0(plane); 
-  cluster->SetX(xplane- cluster->GetX());
+  cluster->SetX(xplane - cluster->GetX());
 
-  TGeoHMatrix *matrix =  fGeom->GetCorrectionMatrix(cluster->GetDetector());
+  TGeoHMatrix *matrix = fGeom->GetCorrectionMatrix(cluster->GetDetector());
   if (!matrix) {
     // No matrix found - if somebody used geometry with holes
     AliError("Invalid Geometry - Default Geometry used\n");
@@ -404,7 +404,7 @@ Bool_t  AliTRDtracker::Transform(AliTRDcluster *cluster)
   }
 
   if (plane == 5) {
-     cluster->SetX(localPosTracker[0]+kX0shift5);
+    cluster->SetX(localPosTracker[0]+kX0shift5);
   }
   else {
     cluster->SetX(localPosTracker[0]+kX0shift);
index 0c61a3e..ad740a4 100644 (file)
@@ -178,7 +178,7 @@ void AliTRDv0::StepManager()
       pla = ((Int_t) idChamber % kNplan);
       det = fGeometry->GetDetector(pla,cha,sec);
 
-      AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(),det,hits,0,kTRUE);       
+      AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(),det,hits,0,0,kTRUE);       
 
     }
 
index aeacf8e..0c238f9 100644 (file)
@@ -297,10 +297,12 @@ void AliTRDv1::CreateTRhit(Int_t det)
 
     // Add the hit to the array. TR photon hits are marked 
     // by negative charge
+    // The hit time is needed for pile-up events
     AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber()
           ,det
           ,posHit
           ,-q
+         ,gMC->TrackTime()*1.0e06
           ,kTRUE);
 
   }
@@ -593,10 +595,12 @@ void AliTRDv1::StepManagerGeant()
         qTot = ((Int_t) (eDelta / kWion) + 1);
 
         // Create a new dEdx hit
+        // The hit time is needed for pile-up events
         AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber()
               ,det
               ,hits
               ,qTot
+             ,gMC->TrackTime()*1.0e06
               ,drRegion);
 
       }
@@ -785,11 +789,13 @@ void AliTRDv1::StepManagerErmilova()
         qTot = ((Int_t) (eDelta / kWion) + 1);
 
        // Create a new dEdx hit
+        // The hit time is needed for pile-up events
         if (drRegion) {
           AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber()
                 ,det
                 ,hits
                 ,qTot
+               ,gMC->TrackTime()*1.0e06
                 ,kTRUE);
        }
         else {
@@ -797,6 +803,7 @@ void AliTRDv1::StepManagerErmilova()
                 ,det
                 ,hits
                 ,qTot
+               ,gMC->TrackTime()*1.0e06
                 ,kFALSE);
        }
 
@@ -938,7 +945,7 @@ void AliTRDv1::StepManagerFixedStep()
   // The detector number
   det = fGeometry->GetDetector(pla,cha,sec);
 
-  // 0: InFlight 1:Entering 2:Exiting
+  // 0:InFlight 1:Entering 2:Exiting
   Int_t trkStat = 0;
 
   // Special hits only in the drift region
@@ -972,6 +979,7 @@ void AliTRDv1::StepManagerFixedStep()
   
   // Calculate the charge according to GEANT Edep
   // Create a new dEdx hit
+  // The hit time is needed for pile-up events
   eDep = TMath::Max(gMC->Edep(),0.0) * 1.0e+09;
   qTot = (Int_t) (eDep / kWion);
   if ((qTot) ||
@@ -980,6 +988,7 @@ void AliTRDv1::StepManagerFixedStep()
           ,det
           ,hits
           ,qTot
+         ,gMC->TrackTime()*1.0e06
           ,drRegion);
   }