/*
$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
///////////////////////////////////////////////////////////////////////////////
// //
// 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"
// Default constructor for the Zero Degree Calorimeter base class
//
fIshunt = 1;
+
fHits = 0;
+ fNhits = 0;
+
+ fStHits = 0;
+ fNStHits = 0;
+
+ fNPrimaryHits = 0;
}
//_____________________________________________________________________________
//
// 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;
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){
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;
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;
}
//
// 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()
{
// 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];
-}
/* $Id$ */
////////////////////////////////////////////////
-// Manager and hits classes for set ZDC //
+// Manager and classes for set ZDC //
////////////////////////////////////////////////
#include "AliDetector.h"
-#include "AliHit.h"
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
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
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