Commiting before moving code from `AliFMDSimulator' to `AliFMD' (and
[u/mrichter/AliRoot.git] / FMD / AliFMDSimulator.cxx
index 398e409dc3928911077760bae03291a831411f1e..2cacd68d07040303fb1c7d50c5c866da676f1ecc 100644 (file)
@@ -80,6 +80,7 @@
 #include "AliFMD2.h"           // ALIFMD2_H
 #include "AliFMD3.h"           // ALIFMD3_H
 #include "AliFMD.h"            // ALIFMD_H
+#include "AliFMDHit.h"         // ALIFMDHIT_H
 #include <AliRun.h>            // ALIRUN_H
 #include <AliMC.h>             // ALIMC_H
 #include <AliMagF.h>           // ALIMAGF_H
 #include <TVirtualMC.h>                // ROOT_TVirtualMC
 #include <TArrayD.h>           // ROOT_TArrayD
 
+
 //====================================================================
 ClassImp(AliFMDSimulator)
 #if 0
@@ -131,11 +133,10 @@ const Char_t* AliFMDSimulator::fgkFlangeName    = "F3SF";
 AliFMDSimulator::AliFMDSimulator() 
   : fFMD(0), 
     fDetailed(kFALSE),
-    fInnerId(-1),
-    fOuterId(-1), 
     fActiveId(4), 
     fUseDivided(kFALSE),
-    fUseAssembly(kTRUE)
+    fUseAssembly(kTRUE), 
+    fBad(0)
 {
   // Default constructor
 }
@@ -145,11 +146,10 @@ AliFMDSimulator::AliFMDSimulator(AliFMD* fmd, Bool_t detailed)
   : TTask("FMDSimulator", "Forward Multiplicity Detector Simulator"), 
     fFMD(fmd), 
     fDetailed(detailed),
-    fInnerId(-1),
-    fOuterId(-1),
     fActiveId(4),
     fUseDivided(kFALSE),
-    fUseAssembly(kTRUE)
+    fUseAssembly(kTRUE),
+    fBad(0)
 {
   // Normal constructor
   // 
@@ -158,6 +158,7 @@ AliFMDSimulator::AliFMDSimulator(AliFMD* fmd, Bool_t detailed)
   //      fmd          Pointer to AliFMD object 
   //      detailed      Whether to make a detailed simulation or not 
   // 
+  fBad = new TClonesArray("AliFMDHit");
 }
 
 
@@ -173,7 +174,7 @@ AliFMDSimulator::DefineMaterials()
   //   FMD Si$         Silicon (active medium in sensors)
   //   FMD C$          Carbon fibre (support cone for FMD3 and vacuum pipe)
   //   FMD Al$         Aluminium (honeycomb support plates)
-  //   FMD PCB$        Printed Circuit Board (FEE board with VA1_ALICE)
+  //   FMD PCB$        Printed Circuit Board (FEE board with VA1_3)
   //   FMD Chip$       Electronics chips (currently not used)
   //   FMD Air$        Air (Air in the FMD)
   //   FMD Plastic$    Plastic (Support legs for the hybrid cards)
@@ -182,6 +183,10 @@ AliFMDSimulator::DefineMaterials()
   // singleton.  These pointers are later used when setting up the
   // geometry 
   AliDebug(10, "\tCreating materials");
+  AliDebug(1,  Form("\tGeometry options: %s, %s, %s",
+                   (fDetailed    ? "detailed" : "coarse"), 
+                   (fUseDivided  ? "divided into strips" : "one volume"), 
+                   (fUseAssembly ? "within assemblies" : "in real volumes")));
   // Get pointer to geometry singleton object. 
   AliFMDGeometry* geometry = AliFMDGeometry::Instance();
   geometry->Init();
@@ -428,7 +433,7 @@ AliFMDSimulator::VMC2FMD(Int_t copy, TLorentzVector& v,
   Int_t det;       mc->CurrentVolOffID(fDetectorOff, det); detector = det;
 
   AliFMDGeometry* fmd = AliFMDGeometry::Instance();
-  Double_t  rz  = fmd->GetDetector(detector)->GetRingZ(ring);
+  //Double_t  rz  = fmd->GetDetector(detector)->GetRingZ(ring);
   Int_t     n   = fmd->GetDetector(detector)->GetRing(ring)->GetNSectors();
 #if 0
   if (rz < 0) {
@@ -445,7 +450,7 @@ AliFMDSimulator::VMC2FMD(Int_t copy, TLorentzVector& v,
   sector--;
   // Get track position
   mc->TrackPosition(v);
-  AliDebug(40, Form("<2> Inside an active FMD volume FMD%d%c[%2d,%3d] %s",
+  AliDebug(15, Form("<2> Inside an active FMD volume FMD%d%c[%2d,%3d] %s",
                    detector, ring, sector, strip, mc->CurrentVolPath()));
 
   return kTRUE;
@@ -493,8 +498,7 @@ AliFMDSimulator::Exec(Option_t* /* option */)
   Int_t copy;
   Int_t vol = mc->CurrentVolID(copy);
   if (!IsActive(vol)) {
-    AliDebug(50, Form("Not an FMD volume %d '%s' (%d or %d)", 
-                     vol, mc->CurrentVolName(), fInnerId, fOuterId));
+    AliDebug(50, Form("Not an FMD volume %d '%s'",vol,mc->CurrentVolName()));
     return;
   }
   TLorentzVector v;
@@ -515,11 +519,13 @@ AliFMDSimulator::Exec(Option_t* /* option */)
   Double_t mass    = mc->TrackMass();
   Double_t edep    = mc->Edep() * 1000; // keV
   Double_t poverm  = (mass == 0 ? 0 : p.P() / mass);
-
+  Bool_t   isBad   = kFALSE;
+  
   // This `if' is to debug abnormal energy depositions.  We trigger on
   // p/m approx larger than or equal to a MIP, and a large edep - more 
   // than 1 keV - a MIP is 100 eV. 
-  if (mc->Edep() * 1000 > absQ * absQ && poverm > 1) {
+  if (edep > absQ * absQ && poverm > 1) {
+    isBad = kTRUE;
     TArrayI procs;
     mc->StepProcesses(procs);
     TString processes;
@@ -543,15 +549,15 @@ AliFMDSimulator::Exec(Option_t* /* option */)
     Int_t mother = gAlice->GetMCApp()->GetPrimary(trackno);
     Warning("Step", "Track # %5d deposits a lot of energy\n" 
            "  Volume:    %s\n" 
-           "  Momentum:  (%8.4f,%8.4f,%8.4f)\n"
+           "  Momentum:  (%7.4f,%7.4f,%7.4f)\n"
            "  PDG:       %d (%s)\n" 
-           "  Edep:      %-16.8f keV (mother %d)\n"
-           "  p/m:       %-16.8f\n"
+           "  Edep:      %-14.7f keV (mother %d)\n"
+           "  p/m:       %-7.4f/%-7.4f = %-14.7f\n"
            "  Processes: %s\n"
            "  What:      %s\n",
            trackno, mc->CurrentVolPath(), p.X(), p.Y(), p.Z(),
-           pdg, pname.Data(), edep, mother, poverm, processes.Data()
-           what.Data());
+           pdg, pname.Data(), edep, mother, p.P(), mass
+           poverm, processes.Data(), what.Data());
   }
   
   // Check that the track is actually within the active area 
@@ -563,35 +569,58 @@ AliFMDSimulator::Exec(Option_t* /* option */)
   // our parameters.
   if (entering) {
     AliDebug(15, Form("Track # %8d entering active FMD volume %s: "
-                     "Edep=%f", 
-                     gAlice->GetMCApp()->GetCurrentTrackNumber(),
-                     mc->CurrentVolPath(), 1000 * mc->Edep()));
+                     "Edep=%f (%f,%f,%f)", trackno, mc->CurrentVolPath(),
+                     edep, v.X(), v.Y(), v.Z()));
     fCurrentP      = p;
     fCurrentV      = v;    
     fCurrentDeltaE = edep;
-    fCurrentPdg    = mc->IdFromPDG(pdg);
+    fCurrentPdg    = pdg; // mc->IdFromPDG(pdg);
   }
   // If the track is inside, then update the energy deposition
   if (inside && fCurrentDeltaE >= 0) {
     fCurrentDeltaE += edep;
     AliDebug(15, Form("Track # %8d inside active FMD volume %s: Edep=%f, "
-                     "Accumulated Edep=%f"
-                     trackno, mc->CurrentVolPath(), edep
-                     fCurrentDeltaE));
+                     "Accumulated Edep=%f  (%f,%f,%f)", trackno
+                     mc->CurrentVolPath(), edep, fCurrentDeltaE
+                     v.X(), v.Y(), v.Z()));
   }
   // The track exits the volume, or it disappeared in the volume, or
   // the track is stopped because it no longer fulfills the cuts
   // defined, then we create a hit. 
-  if (out && fCurrentDeltaE >= 0) {
-    fCurrentDeltaE += edep;
-    fFMD->AddHitByFields(trackno, detector, ring, sector, strip,
-                        fCurrentV.X(),  fCurrentV.Y(), fCurrentV.Z(),
-                        fCurrentP.X(),  fCurrentP.Y(), fCurrentP.Z(), 
-                        fCurrentDeltaE, fCurrentPdg,   fCurrentV.T());
+  if (out) {
+    if (fCurrentDeltaE >= 0) {
+      fCurrentDeltaE += edep;
+      AliDebug(15, Form("Track # %8d exiting active FMD volume %s: Edep=%g, "
+                       "Accumulated Edep=%g (%f,%f,%f)", trackno, 
+                       mc->CurrentVolPath(), edep, fCurrentDeltaE, 
+                       v.X(), v.Y(), v.Z()));
+      AliFMDHit* h = 
+       fFMD->AddHitByFields(trackno, detector, ring, sector, strip,
+                            fCurrentV.X(),  fCurrentV.Y(), fCurrentV.Z(),
+                            fCurrentP.X(),  fCurrentP.Y(), fCurrentP.Z(), 
+                            fCurrentDeltaE, fCurrentPdg,   fCurrentV.T());
+      // Add a copy 
+      if (isBad && fBad) { 
+       new ((*fBad)[fBad->GetEntries()]) AliFMDHit(*h);
+      }
+    }
     fCurrentDeltaE = -1;
   }
 }
 
+//____________________________________________________________________
+void
+AliFMDSimulator::EndEvent() 
+{
+  if (fBad && fBad->GetEntries() > 0) {
+    Warning("EndEvent", "got %d 'bad' hits", fBad->GetEntries());
+    TIter next(fBad);
+    AliFMDHit* hit;
+    while ((hit = static_cast<AliFMDHit*>(next()))) 
+      hit->Print("D");
+    fBad->Clear();
+  }
+}
 
 
 //____________________________________________________________________