X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=MUON%2FAliMUONv1.cxx;h=d26135d7192a1974c5832061fc1b1cb2d79f6bdb;hb=45a58699f4de7d0f9a122352abf868b0913801fb;hp=723eb5d4d62e5fbb5a489b9c145a0253012494f2;hpb=e118b27eada9373935aaa96fdc51b0ac2bf6185f;p=u%2Fmrichter%2FAliRoot.git diff --git a/MUON/AliMUONv1.cxx b/MUON/AliMUONv1.cxx index 723eb5d4d62..d26135d7192 100644 --- a/MUON/AliMUONv1.cxx +++ b/MUON/AliMUONv1.cxx @@ -19,35 +19,42 @@ // Manager and hits classes for set:MUON version 1 // ///////////////////////////////////////////////////////// -#include -#include -#include -#include -#include -#include - #include "AliMUONv1.h" -#include "AliConst.h" -#include "AliMUONChamber.h" #include "AliMUONConstants.h" -#include "AliMUONFactory.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 "AliConst.h" #include "AliMagF.h" #include "AliRun.h" #include "AliMC.h" #include "AliLog.h" +#include +#include +#include +#include +#include +#include + +#include + ClassImp(AliMUONv1) //___________________________________________ AliMUONv1::AliMUONv1() : AliMUON(), - fStepManagerVersionOld(kFALSE), + fStepManagerVersionOld(kTRUE), + fStepManagerVersionDE(kTRUE), fAngleEffect(kTRUE), fStepMaxInActiveGas(0.6), fStepSum(0x0), @@ -59,12 +66,16 @@ AliMUONv1::AliMUONv1() fAngleEffectNorma(0x0) { // Default constructor + AliDebug(1,Form("default (empty) ctor this=%p",this)); } //___________________________________________ -AliMUONv1::AliMUONv1(const char *name, const char *title) - : AliMUON(name,title), - fStepManagerVersionOld(kFALSE), +AliMUONv1::AliMUONv1(const char *name, const char *title, + const char* sDigitizerClassName, + const char* digitizerClassName) +: AliMUON(name,title,sDigitizerClassName,digitizerClassName), + fStepManagerVersionOld(kTRUE), + fStepManagerVersionDE(kTRUE), fAngleEffect(kTRUE), fStepMaxInActiveGas(0.6), fStepSum(0x0), @@ -77,9 +88,9 @@ AliMUONv1::AliMUONv1(const char *name, const char *title) { // Standard onstructor + AliDebug(1,Form("ctor this=%p",this)); + // By default include all stations - AliMUONFactory factory; - factory.Build(this, title); fStepSum = new Float_t [AliMUONConstants::NCh()]; fDestepSum = new Float_t [AliMUONConstants::NCh()]; @@ -122,12 +133,12 @@ AliMUONv1::AliMUONv1(const AliMUONv1& right) AliMUONv1::~AliMUONv1() { // Destructor - + AliDebug(1,Form("dtor this=%p",this)); delete [] fStepSum; delete [] fDestepSum; delete fElossRatio; delete fAngleEffect10; - delete fAngleEffectNorma; + delete fAngleEffectNorma; } //_____________________________________________________________________________ @@ -165,49 +176,46 @@ void AliMUONv1::CreateMaterials() //___________________________________________ void AliMUONv1::Init() -{ - // - // Initialize Tracking Chambers - // - AliDebug(1,"Start Init for version 1 - CPC chamber type"); - Int_t i; - for (i=0; iInit(); - } +{ + AliDebug(1,"Start Init for version 1 - CPC chamber type"); - // - // Initialize geometry - // - fGeometryBuilder->InitGeometry(); - AliDebug(1,"Finished Init for version 1 - CPC chamber type"); - - //cp - AliDebug(1,"Start Init for Trigger Circuits"); - for (i=0; iInit(i); - } - AliDebug(1,"Finished Init for Trigger Circuits"); - //cp - - // - // Debug info - // - if (GetDebug() >1) { - // Print transformations and SV map - for (i=0; iGetDetElementStore()->PrintLocalTransforms(); + // + // Initialize geometry + // + fGeometryBuilder->InitGeometry(); + AliDebug(1,"Finished Init for version 1 - CPC chamber type"); - Chamber(i).GetGeometry() - ->GetSVMap()->Print(""); - } - cout << endl; - } + + std::string ftype(GetTitle()); + + // Build segmentation + // using geometry parametrisation + // + AliMUONSegFactory segFactory(GetGeometryTransformer()); + fSegmentation = segFactory.CreateSegmentation(ftype); + + if (!fSegmentation) { + AliFatal(Form("Wrong factory type : %s",ftype.c_str())); + } + + // Build response + // + AliMUONResponseFactory respFactory("default"); + respFactory.Build(this); + + + // Initialize segmentation + // + fSegmentation->Init(); + + // Initialize trigger circuits + // + for (Int_t i=0; iAt(i)); + c->Init(i); +// c->Print(); + } + } //__________________________________________________________________ @@ -218,12 +226,10 @@ Int_t AliMUONv1::GetChamberId(Int_t volId) const // 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; + for (Int_t i = 0; i < AliMUONConstants::NCh(); i++) { + if ( GetGeometry()->GetModule(i)->IsSensitiveVolume(volId) ) + return i+1; + } return 0; } @@ -244,7 +250,7 @@ TString AliMUONv1::CurrentVolumePath() const gMC->CurrentVolOffID(imother++, copyNo); TString add = "/"; add += name; - add += "."; + add += "_"; add += copyNo; path.Insert(0,add); } @@ -257,14 +263,16 @@ TString AliMUONv1::CurrentVolumePath() const void AliMUONv1::StepManager() { // Stepmanager for the chambers + // TBR - if (fStepManagerVersionOld) { - StepManagerOld(); + if (fStepManagerVersionDE) { + StepManager2(); return; } + // Only charged tracks - if( !(gMC->TrackCharge()) && !(gMC->TrackPid()==0) ) return; + if( !(gMC->TrackCharge()) ) return; // Only charged tracks // Only gas gap inside chamber @@ -284,18 +292,6 @@ void AliMUONv1::StepManager() idvol = iChamber -1; if (idvol == -1) return; - - if (GetDebug() > 1) { - // Fill the global position of detection elements - // Only for verification - AliMUONGeometrySVMap* svMap - = Chamber(iChamber-1).GetGeometry()->GetSVMap(); - Double_t x, y, z; - gMC->TrackPosition(x, y, z); - svMap->AddPosition(CurrentVolumePath(), TGeoTranslation(x, y, z)); - } - - if (gMC->TrackPid()==0) return; // Filling TrackRefs file for MUON. Our Track references are the active volume of the chambers if ( (gMC->IsTrackEntering() || gMC->IsTrackExiting() ) ) @@ -306,11 +302,10 @@ void AliMUONv1::StepManager() if ((TMath::Pi()-theta)*kRaddeg>=15.) gMC->SetMaxStep(fStepMaxInActiveGas); // We use Pi-theta because z is negative } -// if (GetDebug()) { -// Float_t z = ( (AliMUONChamber*)(*fChambers)[idvol])->Z() ; -// Info("StepManager Step","Active volume found %d chamber %d Z chamber is %f ",idvol,iChamber, z); -// } - // Particule id and mass, + // 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(); @@ -319,12 +314,19 @@ void AliMUONv1::StepManager() if ( fStepSum[idvol]==0.0 ) gMC->TrackMomentum(fTrackMomentum); fStepSum[idvol]+=gMC->TrackStep(); -// if (GetDebug()) { -// Info("StepManager Step","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());// Info("StepManager Step","Track Momentum %f %f %f", fTrackMomentum.X(), fTrackMomentum.Y(), fTrackMomentum.Z()) ; -// gMC->TrackPosition(fTrackPosition); -// Info("StepManager Step","Track Position %f %f %f",fTrackPosition.X(),fTrackPosition.Y(),fTrackPosition.Z()) ; -// } + // 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() || @@ -343,10 +345,10 @@ void AliMUONv1::StepManager() TLorentzVector backToWire( fStepSum[idvol]/2.*sin(theta)*cos(phi), fStepSum[idvol]/2.*sin(theta)*sin(phi), fStepSum[idvol]/2.*cos(theta),0.0 ); - // if (GetDebug()) - // Info("StepManager Exit","Track Position %f %f %f",fTrackPosition.X(),fTrackPosition.Y(),fTrackPosition.Z()) ; - // if (GetDebug()) - // Info("StepManager Exit ","Track backToWire %f %f %f",backToWire.X(),backToWire.Y(),backToWire.Z()) ; + // 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 @@ -375,11 +377,11 @@ void AliMUONv1::StepManager() } // Detection elements ids - AliMUONGeometryModule* geometry - = Chamber(iChamber-1).GetGeometry(); + const AliMUONGeometryModule* kGeometryModule + = GetGeometry()->GetModule(iChamber-1); AliMUONGeometryDetElement* detElement - = geometry->FindBySensitiveVolume(CurrentVolumePath()); + = kGeometryModule->FindBySensitiveVolume(CurrentVolumePath()); Int_t detElemId = 0; if (detElement) detElemId = detElement->GetUniqueID(); @@ -417,219 +419,204 @@ void AliMUONv1::StepManager() fTrackPosition.Y(), fTrackPosition.Z()); -// if (GetDebug()){ -// Info("StepManager Exit","Particle exiting from chamber %d",iChamber); -// Info("StepManager Exit","StepSum %f eloss geant %g ",fStepSum[idvol],fDestepSum[idvol]); -// Info("StepManager Exit","Track Position %f %f %f",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::StepManagerOld() +//_______________________________________________________________________________ +void AliMUONv1::StepManager2() { - // Old Stepmanager for the chambers - Int_t copy, id; - static Int_t idvol =-1; - static Int_t vol[2]; - Int_t ipart; - TLorentzVector pos; - TLorentzVector mom; - Float_t theta,phi; - Float_t destep, step; - - static Float_t sstep; - static Float_t eloss, eloss2, xhit, yhit, zhit, tof, tlength; - const Float_t kBig = 1.e10; - static Float_t hits[15]; - - TClonesArray &lhits = *fHits; + // Stepmanager for the chambers - // - // // Only charged tracks if( !(gMC->TrackCharge()) ) return; + // Only charged tracks + + // Only gas gap inside chamber + // Tag chambers and record hits when track enters + static Int_t idvol=-1, iEnter = 0; + Int_t iChamber=0; + Int_t id=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); - vol[0] = GetChamberId(id); - idvol = vol[0] -1; + 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 + iEnter = 1; + gMC->TrackPosition(xyzEnter[0], xyzEnter[1], xyzEnter[2]); // save coordinates of entrance point + } - // - // Get current particle id (ipart), track position (pos) and momentum (mom) - gMC->TrackPosition(pos); - gMC->TrackMomentum(mom); + // 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(); - ipart = gMC->TrackPid(); + 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("Step, 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("Step:Track Momentum %f %f %f", fTrackMomentum.X(), fTrackMomentum.Y(), + // fTrackMomentum.Z())); + // gMC->TrackPosition(fTrackPosition); + // AliDebug(1,Form("Step: Track Position %f %f %f",fTrackPosition.X(), + // fTrackPosition.Y(),fTrackPosition.Z())) ; + //} - // - // momentum loss and steplength in last step - destep = gMC->Edep(); - step = gMC->TrackStep(); - // cout<<"------------"<IsTrackEntering()) { - - gMC->SetMaxStep(fMaxStepGas); - Double_t tc = mom[0]*mom[0]+mom[1]*mom[1]; - Double_t rt = TMath::Sqrt(tc); - Double_t pmom = TMath::Sqrt(tc+mom[2]*mom[2]); - Double_t tx = mom[0]/pmom; - Double_t ty = mom[1]/pmom; - Double_t tz = mom[2]/pmom; - Double_t s = ((AliMUONChamber*)(*fChambers)[idvol]) - ->ResponseModel() - ->Pitch()/tz; - theta = Float_t(TMath::ATan2(rt,Double_t(mom[2])))*kRaddeg; - phi = Float_t(TMath::ATan2(Double_t(mom[1]),Double_t(mom[0])))*kRaddeg; - hits[0] = Float_t(ipart); // Geant3 particle type - hits[1] = pos[0]+s*tx; // X-position for hit - hits[2] = pos[1]+s*ty; // Y-position for hit - hits[3] = pos[2]+s*tz; // Z-position for hit - hits[4] = theta; // theta angle of incidence - hits[5] = phi; // phi angle of incidence - hits[8] = 0;//PadHits does not exist anymore (Float_t) fNPadHits; // first padhit - hits[9] = -1; // last pad hit - hits[10] = mom[3]; // hit momentum P - hits[11] = mom[0]; // Px - hits[12] = mom[1]; // Py - hits[13] = mom[2]; // Pz - tof=gMC->TrackTime(); - hits[14] = tof; // Time of flight - tlength = 0; - eloss = 0; - eloss2 = 0; - sstep=0; - xhit = pos[0]; - yhit = pos[1]; - zhit = pos[2]; - Chamber(idvol).ChargeCorrelationInit(); - // Only if not trigger chamber - -// printf("---------------------------\n"); -// printf(">>>> Y = %f \n",hits[2]); -// printf("---------------------------\n"); + // Track left chamber or StepSum larger than fStepMaxInActiveGas + if ( gMC->IsTrackExiting() || + gMC->IsTrackStop() || + gMC->IsTrackDisappeared()|| + (fStepSum[idvol]>fStepMaxInActiveGas) ) { - - - // if(idvol < AliMUONConstants::NTrackingCh()) { -// // -// // Initialize hit position (cursor) in the segmentation model -// ((AliMUONChamber*) (*fChambers)[idvol]) -// ->SigGenInit(pos[0], pos[1], pos[2]); -// } else { -// //geant3->Gpcxyz(); -// //printf("In the Trigger Chamber #%d\n",idvol-9); -// } - } - eloss2+=destep; - sstep+=step; + 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; + } - // cout<TrackPosition(fTrackPosition); + Float_t theta = fTrackMomentum.Theta(); + Float_t phi = fTrackMomentum.Phi(); + + 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 + Double_t xyz0[3], xyz1[3], tmp[3]; + gMC->Gmtod(xyzEnter, xyz0, 1); // local coord. at the entrance + + fTrackPosition.Vect().GetXYZ(tmp); + gMC->Gmtod(tmp, xyz1, 1); // local coord. at the exit + + 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) + + 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 - // - // Calculate the charge induced on a pad (disintegration) in case - // - // Mip left chamber ... - if( gMC->IsTrackExiting() || gMC->IsTrackStop() || gMC->IsTrackDisappeared()){ - gMC->SetMaxStep(kBig); - eloss += destep; - tlength += step; - - Float_t x0,y0,z0; - Float_t localPos[3]; - Float_t globalPos[3] = {pos[0], pos[1], pos[2]}; - gMC->Gmtod(globalPos,localPos,1); - - if(idvol < AliMUONConstants::NTrackingCh()) { -// tracking chambers - x0 = 0.5*(xhit+pos[0]); - y0 = 0.5*(yhit+pos[1]); - z0 = 0.5*(zhit+pos[2]); - } else { -// trigger chambers - x0 = xhit; - y0 = yhit; - z0 = 0.; - } - - - // if (eloss >0) MakePadHits(x0,y0,z0,eloss,tof,idvol); - - - hits[6] = tlength; // track length - hits[7] = eloss2; // de/dx energy loss - - - // if (fNPadHits > (Int_t)hits[8]) { - // hits[8] = hits[8]+1; - // hits[9] = 0: // PadHits does not exist anymore (Float_t) fNPadHits; - //} -// -// new hit - - new(lhits[fNhits++]) - AliMUONHit(fIshunt, gAlice->GetMCApp()->GetCurrentTrackNumber(), vol,hits); - eloss = 0; - // - // Check additional signal generation conditions - // defined by the segmentation - // model (boundary crossing conditions) - // only for tracking chambers - } else if - ((idvol < AliMUONConstants::NTrackingCh()) && - ((AliMUONChamber*) (*fChambers)[idvol])->SigGenCond(pos[0], pos[1], pos[2])) - { - ((AliMUONChamber*) (*fChambers)[idvol]) - ->SigGenInit(pos[0], pos[1], pos[2]); - - Float_t localPos[3]; - Float_t globalPos[3] = {pos[0], pos[1], pos[2]}; - gMC->Gmtod(globalPos,localPos,1); - - eloss += destep; - - // if (eloss > 0 && idvol < AliMUONConstants::NTrackingCh()) - // MakePadHits(0.5*(xhit+pos[0]),0.5*(yhit+pos[1]),pos[2],eloss,tof,idvol); - xhit = pos[0]; - yhit = pos[1]; - zhit = pos[2]; - eloss = 0; - tlength += step ; - // - // nothing special happened, add up energy loss - } else { - eloss += destep; - tlength += step ; - } -} -//______________________________________________________________________________ -void AliMUONv1::FinishRun() -{ -// Print debug info -// --- + 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 + } + } + + // Detection elements ids + const AliMUONGeometryModule* kGeometryModule + = GetGeometry()->GetModule(iChamber-1); + + AliMUONGeometryDetElement* detElement + = kGeometryModule->FindBySensitiveVolume(CurrentVolumePath()); - if (GetDebug() <= 1) return; + 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, + gAlice->GetMCApp()->GetCurrentTrackNumber(), + detElemId, ipart, + fTrackPosition.X(), + fTrackPosition.Y()+yAngleEffect, + fTrackPosition.Z(), + gMC->TrackTime(), + fTrackMomentum.P(), + theta, + phi, + fStepSum[idvol], + fDestepSum[idvol], + fTrackPosition.X(), + fTrackPosition.Y(), + fTrackPosition.Z()); - // Print the global positions of detection elements - for (Int_t i=0; iGetSVMap(); - - svMap->SortPositions(); - svMap->PrintPositions(); - svMap->ClearPositions(); + fStepSum[idvol] =0; // Reset for the next event + fDestepSum[idvol]=0; // Reset for the next event + iEnter = 0; } - cout << endl; -} +}