]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONv1.cxx
Updated list of MUON libraries
[u/mrichter/AliRoot.git] / MUON / AliMUONv1.cxx
index b959caadef5df53d273309fa062813ee3609d36b..26dfebbaf1721ed16c9730c21fd073ae614a93b3 100644 (file)
@@ -1,6 +1,6 @@
 /**************************************************************************
  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
- *      SigmaEffect_thetadegrees                                                                  *
+ *                                                                        *
  * Author: The ALICE Off-line Project.                                    *
  * Contributors are mentioned in the code where appropriate.              *
  *                                                                        *
 
 /* $Id$ */
 
-/////////////////////////////////////////////////////////
-//  Manager and hits classes for set:MUON version 1    //
-/////////////////////////////////////////////////////////
-
-#include <TRandom.h>
-#include <TF1.h>
-#include <TClonesArray.h>
-#include <TRandom.h> 
-#include <TVirtualMC.h>
-#include <TGeoMatrix.h>
+// --------------------
+// Class AliMUONv1
+// --------------------
+// AliDetector class for MUON subsystem which implements
+// functions for simulation 
 
 #include "AliMUONv1.h"
-#include "AliConst.h" 
-#include "AliMUONChamber.h"
 #include "AliMUONConstants.h"
-#include "AliMUONFactoryV3.h"
-#include "AliMUONFactoryV2.h"
+#include "AliMUONSegFactory.h"
+#include "AliMUONResponseFactory.h"
+#include "AliMUONSegmentation.h"
 #include "AliMUONHit.h"
-#include "AliMUONTriggerCircuit.h"
 #include "AliMUONGeometryBuilder.h"    
+#include "AliMUONGeometry.h"   
+#include "AliMUONGeometryTransformer.h"        
 #include "AliMUONGeometryModule.h"     
-#include "AliMUONGeometrySVMap.h"      
+#include "AliMUONStringIntMap.h"       
 #include "AliMUONGeometryDetElement.h" 
+
+#include "AliMpDEManager.h"
+
+#include "AliConst.h" 
 #include "AliMagF.h"
 #include "AliRun.h"
 #include "AliMC.h"
+#include "AliTrackReference.h"
 #include "AliLog.h"
 
+#include <TRandom.h>
+#include <TF1.h>
+#include <TClonesArray.h>
+#include <TRandom.h> 
+#include <TVirtualMC.h>
+#include <TGeoMatrix.h>
+
 #include <string>
 
+/// \cond CLASSIMP
 ClassImp(AliMUONv1)
+/// \endcond
  
 //___________________________________________
 AliMUONv1::AliMUONv1() 
   : AliMUON(),
-    fStepManagerVersionOld(kFALSE),
-    fStepManagerVersionDE(kFALSE),
     fAngleEffect(kTRUE),
     fStepMaxInActiveGas(0.6),
     fStepSum(0x0),
@@ -60,18 +67,16 @@ AliMUONv1::AliMUONv1()
     fTrackPosition(),
     fElossRatio(0x0),
     fAngleEffect10(0x0),
-    fAngleEffectNorma(0x0),
-    fFactory(0x0)
+    fAngleEffectNorma(0x0)
 {
-// Default constructor
-       AliDebug(1,Form("default (empty) ctor this=%p",this));
+/// Default constructor
+  
+  AliDebug(1,Form("default (empty) ctor this=%p",this));
 } 
 
 //___________________________________________
-AliMUONv1::AliMUONv1(const char *name, const char *title)
-  : AliMUON(name,title), 
-    fStepManagerVersionOld(kFALSE),
-    fStepManagerVersionDE(kFALSE),
+AliMUONv1::AliMUONv1(const char *name, const char* title)
+: AliMUON(name, title), 
     fAngleEffect(kTRUE),
     fStepMaxInActiveGas(0.6),
     fStepSum(0x0),
@@ -80,12 +85,11 @@ AliMUONv1::AliMUONv1(const char *name, const char *title)
     fTrackPosition(),
     fElossRatio(0x0),
     fAngleEffect10(0x0),
-    fAngleEffectNorma(0x0),
-    fFactory(0x0)
+    fAngleEffectNorma(0x0)
 {
-// Standard onstructor
+/// Standard onstructor
 
-       AliDebug(1,Form("ctor this=%p",this));  
+    AliDebug(1,Form("ctor this=%p",this));     
        
     // By default include all stations
 
@@ -117,47 +121,23 @@ AliMUONv1::AliMUONv1(const char *name, const char *title)
     fAngleEffectNorma->SetParameter(3,-1.490e-03);
 }
 
-//_____________________________________________________________________________
-AliMUONv1::AliMUONv1(const AliMUONv1& right) 
-  : AliMUON(right) 
-{  
-  // copy constructor (not implemented)
-
-  AliFatal("Copy constructor not provided.");
-}
-
 //___________________________________________
 AliMUONv1::~AliMUONv1()
 {
-// Destructor
-       AliDebug(1,Form("dtor this=%p",this));
+/// Destructor
+  
+  AliDebug(1,Form("dtor this=%p",this));
   delete [] fStepSum;
   delete [] fDestepSum;
   delete fElossRatio;
   delete fAngleEffect10;
   delete fAngleEffectNorma; 
-  delete fFactory;
 }
 
-//_____________________________________________________________________________
-AliMUONv1& AliMUONv1::operator=(const AliMUONv1& right)
-{
-  // assignement operator (not implemented)
-
-  // check assignement to self
-  if (this == &right) return *this;
-
-  AliFatal("Assignement operator not provided.");
-    
-  return *this;  
-}    
-
 //__________________________________________________
 void AliMUONv1::CreateGeometry()
 {
-//
-// Construct geometry using geometry builder
-//
+/// Construct geometry using geometry builder
 
   fGeometryBuilder->CreateGeometry();
 }
@@ -165,81 +145,69 @@ void AliMUONv1::CreateGeometry()
 //________________________________________________________________
 void AliMUONv1::CreateMaterials()
 {
-//
-// Construct materials using geometry builder
-//
+/// Construct materials using geometry builder
 
   fGeometryBuilder->CreateMaterials();
 }
 
+//________________________________________________________________
+void AliMUONv1::AddAlignableVolumes() const
+{
+/// Construct materials using geometry builder
+
+  GetGeometryTransformer()->AddAlignableVolumes();
+}
+
+
 //___________________________________________
 void AliMUONv1::Init()
 { 
+/// Initialize geometry
+
   AliDebug(1,"Start Init for version 1 - CPC chamber type");
-  Int_t i;
    
-  //
-  // Initialize geometry
-  //
   fGeometryBuilder->InitGeometry();
   AliDebug(1,"Finished Init for version 1 - CPC chamber type");   
-  
-  std::string ftype(GetTitle());
-  
-  if ( ftype == "default" || ftype == "AliMUONFactoryV2") 
-    {
-      fFactory = new AliMUONFactoryV2("New MUON Factory");
-      (static_cast<AliMUONFactoryV2*>(fFactory))->Build(this,"default");
-    }
-  else if ( ftype == "AliMUONFactoryV3" )
-    {
-      fFactory = new AliMUONFactoryV3("New MUON Factory");
-      (static_cast<AliMUONFactoryV3*>(fFactory))->Build(this,"default");
-    }
-  else
-    {
-      AliFatal(Form("Wrong factory type : %s",ftype.c_str()));      
-    }
-      
+
+  // Build segmentation
+  // using geometry parametrisation
   //
-  // Initialize segmentation
+  AliMUONSegFactory segFactory(GetGeometryTransformer());
+  fSegmentation = segFactory.CreateSegmentation();
+
+  // Build response
   //
+  AliMUONResponseFactory respFactory("default");
+  respFactory.Build(this);
   
-  for (i=0; i<AliMUONConstants::NCh(); i++) 
-    ( (AliMUONChamber*) (*fChambers)[i])->Init(2);// new segmentation
-  
-  
-  // trigger circuit
-  // cp 
-  for (i=0; i<AliMUONConstants::NTriggerCircuit(); i++) 
-    ( (AliMUONTriggerCircuit*) (*fTriggerCircuits)[i])->Init(i);
+
+  // Initialize segmentation
+  //
+  fSegmentation->Init();
   
 }
 
 //__________________________________________________________________
-Int_t  AliMUONv1::GetChamberId(Int_t volId) const
+Int_t  AliMUONv1::GetGeomModuleId(Int_t volId) const
 {
-// Check if the volume with specified  volId is a sensitive volume (gas) 
-// of some chamber and returns the chamber number;
-// if not sensitive volume - return 0.
-// ---
-
-/*
-  for (Int_t i = 1; i <= AliMUONConstants::NCh(); i++)
-    if (volId==((AliMUONChamber*)(*fChambers)[i-1])->GetGid()) return i;
-*/
-  for (Int_t i = 1; i <= AliMUONConstants::NCh(); i++)
-    if ( ((AliMUONChamber*)(*fChambers)[i-1])->IsSensId(volId) ) return i;
-
-  return 0;
+/// Check if the volume with specified  volId is a sensitive volume (gas) 
+/// of some chamber and return the chamber number;
+/// if not sensitive volume - return 0.
+
+  for (Int_t i = 0; i < AliMUONConstants::NGeomModules(); i++) {
+    if ( GetGeometry()->GetModule(i)->IsSensitiveVolume(volId) )
+      return i;
+  }    
+
+  return -1;
 }
 
 //_______________________________________________________________________________
 TString  AliMUONv1::CurrentVolumePath() const
 {
-// Returns current volume path
-// (Could be removed when this function is available via gMC)
-// ---      
+/// Return current volume path
+/// (Could be removed when this function is available via gMC)
 
   TString path = "";
   TString name;
@@ -250,7 +218,7 @@ TString  AliMUONv1::CurrentVolumePath() const
     gMC->CurrentVolOffID(imother++, copyNo);
     TString add = "/";
     add += name;
-    add += ".";
+    add += "_";
     add += copyNo;
     path.Insert(0,add); 
   }
@@ -262,14 +230,7 @@ TString  AliMUONv1::CurrentVolumePath() const
 //_______________________________________________________________________________
 void AliMUONv1::StepManager()
 {
-  // Stepmanager for the chambers
-  // TBR
-
- if (fStepManagerVersionDE) {
-    StepManager2();
-    return;
-  }
-
+/// Step manager for the chambers
 
   // Only charged tracks
   if( !(gMC->TrackCharge()) ) return; 
@@ -277,192 +238,68 @@ void AliMUONv1::StepManager()
   
   // Only gas gap inside chamber
   // Tag chambers and record hits when track enters 
-  static Int_t   idvol=-1;
-  Int_t   iChamber=0;
-  Int_t   id=0;
+  static Int_t   idvol=-1, iEnter = 0;
   Int_t   copy;
   const  Float_t kBig = 1.e10;
-
+  static Double_t xyzEnter[3];
 
   //
   // Only gas gap inside chamber
   // Tag chambers and record hits when track enters 
-  id=gMC->CurrentVolID(copy);
-  iChamber = GetChamberId(id);
-  idvol = iChamber -1;
-
-  if (idvol == -1) return;
-
-  // Filling TrackRefs file for MUON. Our Track references are the active volume of the chambers
-  if ( (gMC->IsTrackEntering() || gMC->IsTrackExiting() ) )     
-    AddTrackReference(gAlice->GetMCApp()->GetCurrentTrackNumber());
-  
-   if( gMC->IsTrackEntering() ) {
-     Float_t theta = fTrackMomentum.Theta();
-     if ((TMath::Pi()-theta)*kRaddeg>=15.) gMC->SetMaxStep(fStepMaxInActiveGas); // We use Pi-theta because z is negative
-  }
-
-   //  AliDebug(1,
-   //    Form("Active volume found %d chamber %d Z chamber is %f ",idvol,iChamber,
-   //    ( (AliMUONChamber*)(*fChambers)[idvol])->Z()));
-   // Particule id and mass, 
-  Int_t     ipart = gMC->TrackPid();
-  Float_t   mass  = gMC->TrackMass();
-
-  fDestepSum[idvol]+=gMC->Edep();
-  // Get current particle id (ipart), track position (pos)  and momentum (mom)
-  if ( fStepSum[idvol]==0.0 )  gMC->TrackMomentum(fTrackMomentum);
-  fStepSum[idvol]+=gMC->TrackStep();
-  
-  //  if(AliDebugLevel()) {
-  //  AliDebug(1,
-  //        Form("iChamber %d, Particle %d, theta %f phi %f mass %f StepSum %f eloss %g",
-  //             iChamber,ipart, fTrackMomentum.Theta()*kRaddeg, fTrackMomentum.Phi()*kRaddeg, 
-  //             mass, fStepSum[idvol], gMC->Edep()));
-  //  AliDebug(1,
-  //        Form("Track Momentum %f %f %f", fTrackMomentum.X(), fTrackMomentum.Y(), 
-  //             fTrackMomentum.Z()));
-  //  gMC->TrackPosition(fTrackPosition);
-  //  AliDebug(1,
-  //        Form("Track Position %f %f %f",fTrackPosition.X(),fTrackPosition.Y(),
-  //     fTrackPosition.Z())) ;
-  //   }
-
-  // Track left chamber or StepSum larger than fStepMaxInActiveGas
-  if ( gMC->IsTrackExiting() || 
-       gMC->IsTrackStop() || 
-       gMC->IsTrackDisappeared()||
-       (fStepSum[idvol]>fStepMaxInActiveGas) ) {
-    
-    if   ( gMC->IsTrackExiting() || 
-           gMC->IsTrackStop() || 
-           gMC->IsTrackDisappeared() ) gMC->SetMaxStep(kBig);
-
-    gMC->TrackPosition(fTrackPosition);
-    Float_t theta = fTrackMomentum.Theta();
-    Float_t phi   = fTrackMomentum.Phi();
-    
-    TLorentzVector backToWire( fStepSum[idvol]/2.*sin(theta)*cos(phi),
-                               fStepSum[idvol]/2.*sin(theta)*sin(phi),
-                               fStepSum[idvol]/2.*cos(theta),0.0       );
-    //     AliDebug(1,Form("Exit: Track Position %f %f %f",fTrackPosition.X(),
-    //                     fTrackPosition.Y(),fTrackPosition.Z())) ;
-    //     AliDebug(1,Form("Exit: Track backToWire %f %f %f",backToWire.X(),
-    //                     backToWire.Y(),backToWire.Z()) ;
-    fTrackPosition-=backToWire;
-    
-    //-------------- Angle effect 
-    // Ratio between energy loss of particle and Mip as a function of BetaGamma of particle (Energy/Mass)
-    
-    Float_t betaxGamma    = fTrackMomentum.P()/mass;//  pc/mc2
-    Float_t sigmaEffect10degrees;
-    Float_t sigmaEffectThetadegrees;
-    Float_t eLossParticleELossMip;
-    Float_t yAngleEffect=0.;
-    Float_t thetawires      =  TMath::Abs( TMath::ASin( TMath::Sin(TMath::Pi()-theta) * TMath::Sin(phi) ) );// We use Pi-theta because z is negative
-
-
-    if (fAngleEffect){
-    if ( (betaxGamma >3.2)   &&  (thetawires*kRaddeg<=15.) ) {
-      betaxGamma=TMath::Log(betaxGamma);
-      eLossParticleELossMip = fElossRatio->Eval(betaxGamma);
-      // 10 degrees is a reference for a model (arbitrary)
-      sigmaEffect10degrees=fAngleEffect10->Eval(eLossParticleELossMip);// in micrometers
-      // Angle with respect to the wires assuming that chambers are perpendicular to the z axis.
-      sigmaEffectThetadegrees =  sigmaEffect10degrees/fAngleEffectNorma->Eval(thetawires*kRaddeg);  // For 5mm gap  
-      if ( (iChamber==1)  ||  (iChamber==2) )  
-        sigmaEffectThetadegrees/=(1.09833e+00+1.70000e-02*(thetawires*kRaddeg)); // The gap is different (4mm)
-      yAngleEffect=1.e-04*gRandom->Gaus(0,sigmaEffectThetadegrees); // Error due to the angle effect in cm
-    }
-    }
+  Int_t id=gMC->CurrentVolID(copy);
+  Int_t iGeomModule = GetGeomModuleId(id);
+  if (iGeomModule == -1) return;
+
+  // Detection elements id
+  const AliMUONGeometryModule* kGeometryModule
+    = GetGeometry()->GetModule(iGeomModule);
+  AliMUONGeometryDetElement* detElement
+    = kGeometryModule->FindBySensitiveVolume(CurrentVolumePath());
     
-    // Detection elements ids
-    AliMUONGeometryModule* geometry
-      = Chamber(iChamber-1).GetGeometry();
-
-    AliMUONGeometryDetElement* detElement
-      = geometry->FindBySensitiveVolume(CurrentVolumePath());
-
-    Int_t detElemId = 0;
-    if (detElement) detElemId = detElement->GetUniqueID(); 
+  if (!detElement && iGeomModule < AliMUONConstants::NGeomModules()-2) {
+    iGeomModule++;
+    const AliMUONGeometryModule* kGeometryModule2
+      = GetGeometry()->GetModule(iGeomModule);
+    detElement 
+      = kGeometryModule2->FindBySensitiveVolume(CurrentVolumePath());
+  }    
+
+  Int_t detElemId = 0;
+  if (detElement) detElemId = detElement->GetUniqueID(); 
  
-    if (!detElemId) {
-      cerr << "Chamber id: "
-           << setw(3) << iChamber << "  "
-           << "Current SV: " 
-           <<  CurrentVolumePath() 
-          << "  detElemId: "
-           << setw(5) << detElemId 
-          << endl;
-      Double_t x, y, z;
-      gMC->TrackPosition(x, y, z);        
-      cerr << "   global position: "
-           << x << ", " << y << ", " << z
-           << endl;
-      AliWarning("DetElemId not identified.");
-    }  
-    
-    // One hit per chamber
-    GetMUONData()->AddHit(fIshunt, 
-                         gAlice->GetMCApp()->GetCurrentTrackNumber(), 
-                         iChamber, ipart,
-                         fTrackPosition.X(), 
-                         fTrackPosition.Y()+yAngleEffect, 
-                         fTrackPosition.Z(), 
-                         gMC->TrackTime(),
-                         fTrackMomentum.P(),
-                         theta, 
-                         phi, 
-                         fStepSum[idvol], 
-                         fDestepSum[idvol],                        
-                         fTrackPosition.X(),
-                         fTrackPosition.Y(),
-                         fTrackPosition.Z());
-
-//     if (AliDebugLevel()){
-//       AliDebug(1,Form("Exit: Particle exiting from chamber %d",iChamber));
-//       AliDebug(1,Form("Exit: StepSum %f eloss geant %g ",fStepSum[idvol],fDestepSum[idvol]));
-//       AliDebug(1,Form("Exit: Track Position %f %f %f",fTrackPosition.X(),fTrackPosition.Y(),fTrackPosition.Z())) ;
-//     }
-    fStepSum[idvol]  =0; // Reset for the next event
-    fDestepSum[idvol]=0; // Reset for the next event
-  }
-}
-
-//_______________________________________________________________________________
-void AliMUONv1::StepManager2()
-{
-  // Stepmanager for the chambers
-
-  // Only charged tracks
-  if( !(gMC->TrackCharge()) ) return; 
-  // Only charged tracks
+  if (!detElemId) {
+    AliErrorStream() 
+         << "Geometry module id: "
+        << setw(3) << iGeomModule << "  "
+        << "Current SV: " 
+        <<  CurrentVolumePath() 
+         << "  detElemId: "
+        << setw(5) << detElemId 
+         << endl;
+    Double_t x, y, z;
+    gMC->TrackPosition(x, y, z);        
+    AliErrorStream() 
+         << "  global position: "
+        << x << ", " << y << ", " << z
+        << endl;
+    AliErrorStream() << "DetElemId not identified." << endl;
+  } 
   
-  // Only gas gap inside chamber
-  // Tag chambers and record hits when track enters 
-  static Int_t   idvol=-1;
-  Int_t   iChamber=0;
-  Int_t   id=0;
-  Int_t   copy;
-  const  Float_t kBig = 1.e10;
-
-
-  //
-  // Only gas gap inside chamber
-  // Tag chambers and record hits when track enters 
-  id=gMC->CurrentVolID(copy);
-  iChamber = GetChamberId(id);
+  Int_t iChamber = AliMpDEManager::GetChamberId(detElemId) + 1; 
   idvol = iChamber -1;
-
-  if (idvol == -1) return;
-  
+    
   // Filling TrackRefs file for MUON. Our Track references are the active volume of the chambers
-  if ( (gMC->IsTrackEntering() || gMC->IsTrackExiting() ) )     
-    AddTrackReference(gAlice->GetMCApp()->GetCurrentTrackNumber());
+  if ( (gMC->IsTrackEntering() || gMC->IsTrackExiting() ) ) {
+    AliTrackReference* trackReference    
+      = AddTrackReference(gAlice->GetMCApp()->GetCurrentTrackNumber());
+    trackReference->SetUserId(detElemId);
+  }  
   
-   if( gMC->IsTrackEntering() ) {
+  if( gMC->IsTrackEntering() ) {
      Float_t theta = fTrackMomentum.Theta();
      if ((TMath::Pi()-theta)*kRaddeg>=15.) gMC->SetMaxStep(fStepMaxInActiveGas); // We use Pi-theta because z is negative
+     iEnter = 1;
+     gMC->TrackPosition(xyzEnter[0], xyzEnter[1], xyzEnter[2]); // save coordinates of entrance point
   }
 
    //   AliDebug(1,
@@ -497,19 +334,56 @@ void AliMUONv1::StepManager2()
     if   ( gMC->IsTrackExiting() || 
            gMC->IsTrackStop() || 
            gMC->IsTrackDisappeared() ) gMC->SetMaxStep(kBig);
+    if (fDestepSum[idvol] == 0) {
+      // AZ - no energy release
+      fStepSum[idvol] = 0; // Reset for the next event
+      iEnter = 0;
+      return; 
+    }
 
     gMC->TrackPosition(fTrackPosition);
     Float_t theta = fTrackMomentum.Theta();
     Float_t phi   = fTrackMomentum.Phi();
     
-    TLorentzVector backToWire( fStepSum[idvol]/2.*sin(theta)*cos(phi),
-                               fStepSum[idvol]/2.*sin(theta)*sin(phi),
-                               fStepSum[idvol]/2.*cos(theta),0.0       );
-    //    AliDebug(1,
-    //      Form("Track Position %f %f %f",fTrackPosition.X(),fTrackPosition.Y(),fTrackPosition.Z()));
-    // AliDebug(1,
-    //      Form("Exit: Track backToWire %f %f %f",backToWire.X(),backToWire.Y(),backToWire.Z())) ;
-    fTrackPosition-=backToWire;
+    Int_t merge = 0;
+    Double_t xyz0[3]={0}, xyz1[3]={0}, tmp[3]={0};
+    if (gMC->IsTrackExiting() && iEnter != 0) {
+      // AZ - this code is to avoid artificial hit splitting at the
+      // "fake" boundary inside the same chamber. It will still produce 
+      // 2 hits but with the same coordinates (at the wire) to allow 
+      // their merging at the digitization level.
+
+      // Only for a track going from the entrance to the exit from the volume
+      // Get local coordinates
+      gMC->Gmtod(xyzEnter, xyz0, 1); // local coord. at the entrance
+
+      fTrackPosition.Vect().GetXYZ(tmp);
+      gMC->Gmtod(tmp, xyz1, 1); // local coord. at the exit
+      Float_t dx = xyz0[0] - xyz1[0];
+      Float_t dy = xyz0[1] - xyz1[1];
+      Float_t thLoc = TMath::ATan2 (TMath::Sqrt(dx*dx+dy*dy), TMath::Abs(xyz0[2]-xyz1[2]));
+      if (thLoc * TMath::RadToDeg() < 15) merge = 1; 
+    }
+
+    if (merge) {
+      Double_t dz = -0.5;
+      if (xyz1[2] != xyz0[2]) dz = xyz0[2] / (xyz1[2] - xyz0[2]);
+      tmp[0] = xyz0[0] - (xyz1[0] - xyz0[0]) * dz; // local coord. at the wire
+      tmp[1] = xyz0[1] - (xyz1[1] - xyz0[1]) * dz;
+      tmp[2] = xyz0[2] - (xyz1[2] - xyz0[2]) * dz;
+      gMC->Gdtom(tmp, xyz1, 1); // global coord. at the wire
+      fTrackPosition.SetXYZT(xyz1[0], xyz1[1], xyz1[2], fTrackPosition.T());
+    } else {
+      TLorentzVector backToWire( fStepSum[idvol]/2.*sin(theta)*cos(phi),
+                                fStepSum[idvol]/2.*sin(theta)*sin(phi),
+                                fStepSum[idvol]/2.*cos(theta),0.0       );
+      fTrackPosition-=backToWire;
+      //printf(" %d %d %d %f %d \n", gMC->IsTrackExiting(), gMC->IsTrackStop(), gMC->IsTrackDisappeared(), fStepSum[idvol], iEnter);
+      //    AliDebug(1,
+      //     Form("Track Position %f %f %f",fTrackPosition.X(),fTrackPosition.Y(),fTrackPosition.Z()));
+      // AliDebug(1,
+      //     Form("Exit: Track backToWire %f %f %f",backToWire.X(),backToWire.Y(),backToWire.Z())) ;
+    }
     
     //-------------- Angle effect 
     // Ratio between energy loss of particle and Mip as a function of BetaGamma of particle (Energy/Mass)
@@ -536,34 +410,8 @@ void AliMUONv1::StepManager2()
     }
     }
     
-    // Detection elements ids
-    AliMUONGeometryModule* geometry
-      = Chamber(iChamber-1).GetGeometry();
-
-    AliMUONGeometryDetElement* detElement
-      = geometry->FindBySensitiveVolume(CurrentVolumePath());
-
-    Int_t detElemId = 0;
-    if (detElement) detElemId = detElement->GetUniqueID(); 
-    if (!detElemId) {
-      cerr << "Chamber id: "
-           << setw(3) << iChamber << "  "
-           << "Current SV: " 
-           <<  CurrentVolumePath() 
-          << "  detElemId: "
-           << setw(5) << detElemId 
-          << endl;
-      Double_t x, y, z;
-      gMC->TrackPosition(x, y, z);        
-      cerr << "   global position: "
-           << x << ", " << y << ", " << z
-           << endl;
-      AliError("DetElemId not identified.");
-    }  
-    
     // One hit per chamber
-    GetMUONData()->AddHit2(fIshunt, 
+    GetMUONData()->AddHit(fIshunt, 
                          gAlice->GetMCApp()->GetCurrentTrackNumber(), 
                          detElemId, ipart,
                          fTrackPosition.X(), 
@@ -585,5 +433,6 @@ void AliMUONv1::StepManager2()
 
     fStepSum[idvol]  =0; // Reset for the next event
     fDestepSum[idvol]=0; // Reset for the next event
+    iEnter = 0;
   }
 }