]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ZDC/AliZDC.cxx
Adding functions ZMin and ZMax
[u/mrichter/AliRoot.git] / ZDC / AliZDC.cxx
index 7eb20d5f4a27f9badcfa002c694672a9e73bef98..8cc03bbb12418c3114b49dd160308661a32511ed 100644 (file)
 
 /*
 $Log$
+Revision 1.21  2001/04/20 10:05:02  coppedis
+Minor changes
+
+Revision 1.20  2001/03/26 13:39:20  coppedis
+Comment prints
+
+Revision 1.19  2001/03/26 09:10:23  coppedis
+Corrected bug in constructor (fIshunt has to be =1)
+
+Revision 1.18  2001/03/20 08:21:55  coppedis
+ZDC needs PIPE, ABSO, DIPO and SHIL
+
+Revision 1.17  2001/03/16 16:18:03  coppedis
+Correction for superposition of ZDC volumes with MUON arm one
+
+Revision 1.16  2001/03/15 16:01:11  coppedis
+Code review
+
+Revision 1.15  2001/01/26 19:56:27  hristov
+Major upgrade of AliRoot code
+
+Revision 1.14  2000/12/12 13:17:01  coppedis
+Minor corrections suggested by P. Hristov
+
+Revision 1.12  2000/12/01 08:19:01  coppedis
+Adding a message error if ZDC is constructed without DIPO
+
+Revision 1.11  2000/11/30 17:21:03  coppedis
+Introduce hit array fStHits reset only at the end of the event (for digitization)
+
+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
+
+Revision 1.8  2000/07/10 13:58:01  fca
+New version of ZDC from E.Scomparin & C.Oppedisano
+
 Revision 1.7  2000/01/19 17:17:40  fca
 
 Revision 1.6  1999/09/29 09:24:35  fca
@@ -25,17 +64,26 @@ 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                                         //
 //                                                                           //
 ///////////////////////////////////////////////////////////////////////////////
 
+#include <stdlib.h>
+
+// --- ROOT system
 #include <TBRIK.h>
 #include <TNode.h>
+#include <TGeometry.h>
+#include <TFile.h>
+#include <TTree.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"
@@ -49,8 +97,15 @@ AliZDC::AliZDC()
   //
   // Default constructor for the Zero Degree Calorimeter base class
   //
+  
   fIshunt = 1;
-  fHits = 0;
+
+  fNhits = 0;
+
+  fNStHits = 0;
+
+//  fNPrimaryHits = 0;
+  fNoShower   = 0;
 }
  
 //_____________________________________________________________________________
@@ -63,105 +118,143 @@ AliZDC::AliZDC(const char *name, const char *title)
 
   //
   // Allocate the array of hits
-  fHits   = new TClonesArray("AliZDChit",  405);
-  gAlice->AddHitList(fHits);
   
   fIshunt =  1;
+
+  fHits   = new TClonesArray("AliZDCHit",1000);
+  gAlice->AddHitList(fHits);
   
-  fDimZN[0] = 3.52;
-  fDimZN[1] = 3.52;
-  fDimZN[2] = 50.;
-  fDimZP[0] = 11.2;
-  fDimZP[1] = 6.;
-  fDimZP[2] = 75.;
-  fPosZN[0] = 0.;
-  fPosZN[1] = 0.;
-  fPosZN[2] = 11650.;
-  fPosZP[0] = -23.;
-  fPosZP[1] = 0.;
-  fPosZP[2] = 11600.;
-  fFibZN[0] = 0.;
-  fFibZN[1] = 0.01825;
-  fFibZN[2] = 50.;
-  fFibZP[0] = 0.;
-  fFibZP[1] = 0.0275;
-  fFibZP[2] = 75.;
-  fGrvZN[0] = 0.03;
-  fGrvZN[1] = 0.03;
-  fGrvZN[2] = 50.;
-  fGrvZP[0] = 0.04;
-  fGrvZP[1] = 0.04;
-  fGrvZP[2] = 75.;
-  fDivZN[0] = 11;
-  fDivZN[1] = 11;
-  fDivZN[2] = 0;
-  fDivZP[0] = 7;
-  fDivZP[1] = 15;
-  fDivZP[2] = 0;
-  fTowZN[0] = 2;
-  fTowZN[1] = 2;
-  fTowZP[0] = 4;
-  fTowZP[1] = 1;
+  fStHits = new TClonesArray("AliZDCHit",1000);
+  fNStHits = 0;
+
+//  fNPrimaryHits = 0;
+  fNoShower   = 0;
+
+}
+//____________________________________________________________________________ 
+AliZDC::~AliZDC()
+{
+  //
+  // ZDC destructor
+  //
+
+  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 &lhits = *fHits;
+  AliZDCHit *newquad, *curprimquad, *curevquad;  
+  newquad = new AliZDCHit(fIshunt, track, vol, hits);
 
-  AliZDChit *newquad, *curquad;
-  newquad = new AliZDChit(fIshunt, track, vol, hits);
-  Int_t i;
-  for(i=0; i<fNhits; i++){
-    // 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("");
-       return;
-      }
-   }
-   
-   //Otherwise create a new hit.
-   if(fNhits==0){
+  TClonesArray &lsthits = *fStHits;
+  TClonesArray &lhits = *fHits;
+  
+  if(fNhits==0){
       // First hit -> setting flag for primary or secondary particle
       Int_t primary = gAlice->GetPrimary(track);     
       if(track != primary){
-        newquad->fSFlag = 1;  // Hit created by secondary particle entering the ZDC
+        newquad->fSFlag = 1;  // SECONDARY particle entering the ZDC
       }
       else if(track == primary){
-        newquad->fSFlag = 0;  // Hit created by PRIMARY particle entering the ZDC
+        newquad->fSFlag = 0;  // PRIMARY particle entering the ZDC
       }  
-      sFlag = newquad->fSFlag;
+//      fNPrimaryHits += 1;
+      sFlag    = newquad->fSFlag;
       primKinEn = newquad->fPrimKinEn;
-      xImpact = newquad->fXImpact;
-      yImpact = newquad->fYImpact;
+      xImpact  = newquad->fXImpact;
+      yImpact  = newquad->fYImpact;
    }
    else{       
       newquad->fPrimKinEn = primKinEn;
-      newquad->fXImpact = xImpact;
+      newquad->fXImpact        = xImpact;
       newquad->fYImpact = yImpact;
-      newquad->fSFlag = sFlag;
+      newquad->fSFlag  = sFlag;
    }
-   new(lhits[fNhits++]) AliZDChit(newquad);
-    if(fNhits==1) {
-//      Int_t Curtrack = gAlice->CurrentTrack();
-//      Int_t Prim = gAlice->GetPrimary(Curtrack);
-//      printf ("              Primary track: %d, Current track: %d \n", 
-//              Prim, Curtrack);
-//      fHits->Print("");
+  Int_t i,j,kStHit = 1;
+  for(i=0; i<fNStHits; i++){
+    // If hits are equal (same track, same volume), sum them.
+     curevquad = (AliZDCHit*) lsthits[i];
+     kStHit = 1;
+     if(*curevquad == *newquad){
+       *curevquad = *curevquad+*newquad;
+       kStHit = 0;
+     } 
+     if(kStHit == 0) break;
+  }
+
+  for(j=0; j<fNhits; j++){
+    // If hits are equal (same track, same volume), sum them.
+     curprimquad = (AliZDCHit*) lhits[j];
+     if(*curprimquad == *newquad){
+        *curprimquad = *curprimquad+*newquad;
+       delete newquad;
+       return;
+     } 
+  }
+
+    //Otherwise create a new hit
+    new(lhits[fNhits]) AliZDCHit(newquad);
+    fNhits++;
+    
+    if(kStHit){
+      new(lsthits[fNStHits]) AliZDCHit(newquad);
+      fNStHits++;
+    }
+
+    if(fDebug == 1){ 
+      printf("\n  Primary Hits --------------------------------------------------------\n");
+      fHits->Print("");
+      printf("\n  Event Hits --------------------------------------------------------\n");
+      fStHits->Print("");
     }
+
     delete newquad;
-//    fHits->Print("");
-  
+  }
+//____________________________________________________________________________
+Float_t AliZDC::ZMin(void) const
+{
+  // Minimum dimension of the ZDC module in z
+  return 11600.;
+}
+
+//____________________________________________________________________________
+Float_t AliZDC::ZMax(void) const
+{
+  // Maximum dimension of the ZDC module in z
+  return  11750.;
 }
   
+//_____________________________________________________________________________
+void AliZDC::ResetDigits()
+{
+  //
+  // Reset number of digits and the digits array
+  //
+    
+    AliDetector::ResetDigits();
+//    fNStHits = 0;
+//    if(fStHits) fStHits->Clear();
+}
+
 //_____________________________________________________________________________
 void AliZDC::BuildGeometry()
 {
@@ -203,26 +296,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]; 
-}