/*
$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
///////////////////////////////////////////////////////////////////////////////
// //
// 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"
//
// Default constructor for the Zero Degree Calorimeter base class
//
+
fIshunt = 1;
- fHits = 0;
+
+ fNhits = 0;
+
+ fNStHits = 0;
+
+// fNPrimaryHits = 0;
+ fNoShower = 0;
}
//_____________________________________________________________________________
//
// 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()
{
// 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];
-}