Introduce hit array fStHits reset only at the end of the event (for digitization)
authorcoppedis <coppedis@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 30 Nov 2000 17:21:11 +0000 (17:21 +0000)
committercoppedis <coppedis@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 30 Nov 2000 17:21:11 +0000 (17:21 +0000)
ZDC/AliZDC.cxx
ZDC/AliZDC.h

index 215961c46c9efb20fc5a4926950e6487dc0eadad..02ce3cdf7495ea0fa705342758420054e9a3f5ff 100644 (file)
@@ -15,6 +15,9 @@
 
 /*
 $Log$
+Revision 1.10  2000/11/22 11:32:58  coppedis
+Major code revision
+
 Revision 1.9  2000/10/02 21:28:20  fca
 Removal of useless dependecies via forward declarations
 
@@ -31,18 +34,22 @@ Introduction of the Copyright and cvs Log
 ///////////////////////////////////////////////////////////////////////////////
 //                                                                           //
 //  Zero Degree Calorimeter                                                  //
-//  This class contains the basic functions for the Time Of Flight           //
-//  detector. Functions specific to one particular geometry are              //
+//  This class contains the basic functions for the ZDCs                     //
+//  Functions specific to one particular geometry are                       //
 //  contained in the derived classes                                         //
 //                                                                           //
 ///////////////////////////////////////////////////////////////////////////////
 
+// --- ROOT system
 #include <TBRIK.h>
 #include <TNode.h>
 #include "TGeometry.h"
 
+// --- AliRoot header files
 #include "AliZDC.h"
+#include "AliZDCHit.h"
 #include "AliRun.h"
+#include "AliDetector.h"
 #include "AliCallf77.h"
 #include "AliConst.h"
 #include "AliMC.h"
@@ -57,7 +64,14 @@ AliZDC::AliZDC()
   // Default constructor for the Zero Degree Calorimeter base class
   //
   fIshunt = 1;
+
   fHits = 0;
+  fNhits = 0;
+
+  fStHits = 0;
+  fNStHits = 0;
+
+  fNPrimaryHits = 0;
 }
  
 //_____________________________________________________________________________
@@ -70,9 +84,16 @@ AliZDC::AliZDC(const char *name, const char *title)
 
   //
   // Allocate the array of hits
-  fHits   = new TClonesArray("AliZDChit",  405);
+
+  fHits   = new TClonesArray("AliZDCHit",1000);
   gAlice->AddHitList(fHits);
   
+  fStHits = new TClonesArray("AliZDCHit",1000);
+
+  fNStHits = 0;
+
+  fNPrimaryHits = 0;
+  
   fIshunt =  1;
   
   fDimZN[0] = 3.52;
@@ -140,33 +161,55 @@ AliZDC::~AliZDC()
 
   fIshunt   = 0;
   delete fHits;
+  if(fStHits){
+    fStHits->Delete();
+    delete fStHits;
+    fNStHits = 0;
+  }
+  delete fDigits;
 }
 //_____________________________________________________________________________
 void AliZDC::AddHit(Int_t track, Int_t *vol, Float_t *hits)
 {
   //
-  // Add a ZDC hit
+  //           Add a ZDC hit to the hit list.
+  // -> We make use of 2 array of hits:
+  // [1]  fHits (the usual one) that contains hits for each PRIMARY
+  // [2]  fStHits that contains hits for each EVENT and is used to
+  //     obtain digits at the end of each event
   //
+  
   static Float_t primKinEn, xImpact, yImpact, sFlag;
 
+  TClonesArray &lsthits = *fStHits;
   TClonesArray &lhits = *fHits;
 
-  AliZDChit *newquad, *curquad;
-  newquad = new AliZDChit(fIshunt, track, vol, hits);
-  Int_t i;
-  for(i=0; i<fNhits; i++){
+
+  AliZDCHit *newquad, *curevquad, *curprimquad;
+  newquad = new AliZDCHit(fIshunt, track, vol, hits);
+   
+  Int_t i,j,kStHit = 1;
+  for(i=0; i<fNStHits; i++){
+    // If the hits are equal (same track, same volume), sum them.
+     curevquad = (AliZDCHit*) lsthits[i];
+     kStHit = 1;
+     if(*curevquad == *newquad){
+        *curevquad = *curevquad+*newquad;
+        kStHit = 0;
+     } 
+  }
+
+  for(j=0; j<fNhits; j++){
     // If the hits are equal (same track, same volume), sum them.
-     curquad=(AliZDChit*) lhits[i];
-     if(*curquad==*newquad){
-        *curquad = *curquad+*newquad;
-        delete newquad;
-//        fHits->Print("");
+     curprimquad = (AliZDCHit*) lhits[j];
+     if(*curprimquad == *newquad){
+        *curprimquad = *curprimquad+*newquad;
+       delete newquad;
        return;
-      }
-   }
-   
-   //Otherwise create a new hit.
-   if(fNhits==0){
+     } 
+  }
+  
+  if(fNhits==0){
       // First hit -> setting flag for primary or secondary particle
       Int_t primary = gAlice->GetPrimary(track);     
       if(track != primary){
@@ -175,6 +218,7 @@ void AliZDC::AddHit(Int_t track, Int_t *vol, Float_t *hits)
       else if(track == primary){
         newquad->fSFlag = 0;  // Hit created by PRIMARY particle entering the ZDC
       }  
+      fNPrimaryHits = fNPrimaryHits + 1;
       sFlag = newquad->fSFlag;
       primKinEn = newquad->fPrimKinEn;
       xImpact = newquad->fXImpact;
@@ -186,9 +230,21 @@ void AliZDC::AddHit(Int_t track, Int_t *vol, Float_t *hits)
       newquad->fYImpact = yImpact;
       newquad->fSFlag = sFlag;
    }
-//    printf("\n");  
+
+    //Otherwise create a new hit
+    new(lhits[fNhits]) AliZDCHit(newquad);
+    fNhits++;
+    
+    if(kStHit){
+      new(lsthits[fNStHits]) AliZDCHit(newquad);
+      fNStHits++;
+    }
+//    printf("\nPrimary Hits --------------------------------------------------------\n");
 //    fHits->Print("");
-    new(lhits[fNhits++]) AliZDChit(newquad);
+//    printf("\n  Event Hits --------------------------------------------------------\n");
+//    fStHits->Print("");
+
     delete newquad;
   }
   
@@ -198,8 +254,27 @@ void AliZDC::ResetHits()
   //
   // Reset number of hits and the hits array
   //
+    
+//    fStHits->Clear();
+//    fNStHits = 0;
+    
     AliDetector::ResetHits();
 }
+  
+//_____________________________________________________________________________
+void AliZDC::ResetDigits()
+{
+  //
+  // Reset number of digits and the digits array
+  //
+    
+    AliDetector::ResetDigits();
+    if(fStHits){
+      fStHits->Delete();
+      fNStHits = 0;
+    }
+}
+
 //_____________________________________________________________________________
 void AliZDC::BuildGeometry()
 {
@@ -241,26 +316,3 @@ void AliZDC::StepManager()
   // Routine called at every step in the Zero Degree Calorimeter
   //
 }
-
-ClassImp(AliZDChit)
-  
-//_____________________________________________________________________________
-AliZDChit::AliZDChit(Int_t shunt, Int_t track, Int_t *vol, Float_t *hits):
-  AliHit(shunt, track)
-{
-  //
-  // Add a ZDC hit
-  //
-  Int_t i;
-  for(i=0; i<2; i++) fVolume[i] = vol[i];
-  fX = hits[0];
-  fY = hits[1];
-  fZ = hits[2];
-  fPrimKinEn = hits[3];
-  fXImpact = hits[4];
-  fYImpact = hits[5];
-  fSFlag = hits[6];
-  fLightPMQ = hits[7];
-  fLightPMC = hits[8];
-  fEnergy = hits[9]; 
-}
index 2e77ffe040a028e19a81c863719214010312aebf..8b77c5d7aea1114df6543bd909e42a21a09874c3 100644 (file)
@@ -6,11 +6,10 @@
 /* $Id$ */
 
 ////////////////////////////////////////////////
-//  Manager and hits classes for set ZDC      //
+//  Manager and classes for set ZDC           //
 ////////////////////////////////////////////////
  
 #include "AliDetector.h"
-#include "AliHit.h"
 
  
 class AliZDC : public AliDetector {
@@ -18,17 +17,19 @@ class AliZDC : public AliDetector {
 public:
   AliZDC();
   AliZDC(const char *name, const char *title);
-  virtual      ~AliZDC();
+  virtual       ~AliZDC();
   virtual void  AddHit(Int_t track, Int_t *vol, Float_t *hits);
   virtual void  BuildGeometry();
   virtual void  CreateGeometry() {}
   virtual void  CreateMaterials() {}
-  Int_t          DistancetoPrimitive(Int_t px, Int_t py);
+  Int_t         DistancetoPrimitive(Int_t px, Int_t py);
   virtual Int_t IsVersion() const =0;
   virtual void  StepManager();
   virtual void  ResetHits(); 
+  virtual void  ResetDigits(); 
 
 protected:
+
   // Parameters for hadronic calorimeters geometry
   Float_t fDimZN[3];  // Dimensions of neutron detector
   Float_t fDimZP[3];  // Dimensions of proton detector
@@ -42,6 +43,7 @@ protected:
   Int_t   fDivZP[3];  // Division for proton detector
   Int_t   fTowZN[2];  // Tower for neutron detector
   Int_t   fTowZP[2];  // Tower for proton detector
+
   // Parameters for EM calorimeter geometry
   Float_t fDimZEMPb;  // z-dimension of the Pb slice
   Float_t fDimZEMAir; // scotch
@@ -51,56 +53,14 @@ protected:
   Float_t fPosZEM[3]; // Position of EM detector
   Int_t   fDivZEM[3]; // Divisions for EM detector
   
+  // TClonesArray of stored hits -> not reset et finish event
+  //   (for digitization at the end of the event)
+  TClonesArray *fStHits;
+  Int_t fNStHits;
+  
+  Int_t   fNPrimaryHits;
 
    ClassDef(AliZDC,1)  // Zero Degree Calorimeter base class
 };
-
-//_____________________________________________________________________________
-class AliZDChit : public AliHit {
-
-public:
-  Int_t      fVolume[2];    //Array of volumes
-  Float_t    fX;           //X-coord. in the hall RS
-  Float_t    fY;           //Y-coord. in the hall RS
-  Float_t    fZ;           //Z-coord. in the hall RS
-  Float_t    fPrimKinEn;    //Primary particle energy
-  Float_t    fXImpact;      //x-coord. of the impact point over the ZDC
-  Float_t    fYImpact;      //y-coord. of the impact point over the ZDC
-  Float_t    fSFlag;        //Secondary flag
-  Float_t    fLightPMQ;     //Cerenkov light produced in each quadrant
-  Float_t    fLightPMC;     //Cerenkov light seen by the common PM
-  Float_t    fEnergy;       //Total energy deposited in eV
-public:
-  AliZDChit() {}
-  AliZDChit(Int_t shunt, Int_t track, Int_t *vol, Float_t *hits);
-  AliZDChit(AliZDChit* oldhit) {*this=*oldhit;}
-  virtual ~AliZDChit() {}
-  virtual Int_t GetVolume(Int_t i) {return fVolume[i];}
-  virtual Float_t GetLightPMQ() {return fLightPMQ;}
-  virtual Float_t GetLightPMC() {return fLightPMC;}
-  virtual Float_t GetEnergy() {return fEnergy;}
-  Int_t operator == (AliZDChit &quad) {
-     Int_t i;
-     if(fTrack!=quad.GetTrack()) return 0;
-     for(i=0; i<2; i++) if(fVolume[i]!=quad.GetVolume(i)) return 0;
-     return 1;
-  }
-  virtual AliZDChit& operator + (AliZDChit &quad) {
-     fLightPMQ+=quad.GetLightPMQ();
-     fLightPMC+=quad.GetLightPMC();
-     fEnergy+=quad.GetEnergy();
-     return *this;
-  }
-  virtual void Print(Option_t *) {
-     printf(" -> HIT: vol[0] =  %d vol[1] =  %d Track: %d \n" 
-            "  hit[3] = %f, hit[4] = %f, hit[5] = %f, SFlag = %f\n"
-           "  PMQLight = %f, PMCLight = %f, Energy %f\n ", 
-           fVolume[0],fVolume[1],fTrack,fPrimKinEn,fXImpact,fYImpact,
-           fSFlag,fLightPMQ,fLightPMC,fEnergy);
-  }
-
-  ClassDef(AliZDChit,1)  // Hits for the Zero Degree Calorimeters
-};
  
 #endif