X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;ds=sidebyside;f=MUON%2FAliMUONv1.cxx;h=d25249e171405fa90f5cc8d0ea6be370f8fad68e;hb=75eff6de2d7200ef8cd1a53bb2f14934ae346818;hp=c172dcabef61522893b3b8c5a01739807cdc83cf;hpb=bb2bab357b48e746f597b085dc1193e2e4738be5;p=u%2Fmrichter%2FAliRoot.git diff --git a/MUON/AliMUONv1.cxx b/MUON/AliMUONv1.cxx index c172dcabef6..d25249e1714 100644 --- a/MUON/AliMUONv1.cxx +++ b/MUON/AliMUONv1.cxx @@ -15,11 +15,12 @@ /* $Id$ */ -// -------------------- +//----------------------------------------------------------------------------- // Class AliMUONv1 // -------------------- // AliDetector class for MUON subsystem which implements // functions for simulation +//----------------------------------------------------------------------------- #include "AliMUONv1.h" #include "AliMUONConstants.h" @@ -32,6 +33,7 @@ #include "AliMUONStringIntMap.h" #include "AliMUONGeometryDetElement.h" +#include "AliMpCDB.h" #include "AliMpDEManager.h" #include "AliConst.h" @@ -41,17 +43,22 @@ #include "AliTrackReference.h" #include "AliLog.h" -#include -#include #include +#include +#include +#include +#include +#include #include #include -#include #include #include "AliMUONVHitStore.h" +using std::endl; +using std::cout; +using std::setw; /// \cond CLASSIMP ClassImp(AliMUONv1) /// \endcond @@ -60,6 +67,7 @@ ClassImp(AliMUONv1) AliMUONv1::AliMUONv1() : AliMUON(), fAngleEffect(kTRUE), + fMagEffect(kTRUE), fStepMaxInActiveGas(0.6), fStepSum(0x0), fDestepSum(0x0), @@ -67,7 +75,8 @@ AliMUONv1::AliMUONv1() fTrackPosition(), fElossRatio(0x0), fAngleEffect10(0x0), - fAngleEffectNorma(0x0) + fAngleEffectNorma(0x0), + fMagAngleEffectNorma(0x0) { /// Default constructor @@ -78,6 +87,7 @@ AliMUONv1::AliMUONv1() AliMUONv1::AliMUONv1(const char *name, const char* title) : AliMUON(name, title), fAngleEffect(kTRUE), + fMagEffect(kTRUE), fStepMaxInActiveGas(0.6), fStepSum(0x0), fDestepSum(0x0), @@ -85,12 +95,18 @@ AliMUONv1::AliMUONv1(const char *name, const char* title) fTrackPosition(), fElossRatio(0x0), fAngleEffect10(0x0), - fAngleEffectNorma(0x0) + fAngleEffectNorma(0x0), + fMagAngleEffectNorma(0x0) { /// Standard onstructor AliDebug(1,Form("ctor this=%p",this)); + // Load mapping + if ( ! AliMpCDB::LoadMpSegmentation() ) { + AliFatal("Could not access mapping from OCDB !"); + } + // By default include all stations fStepSum = new Float_t [AliMUONConstants::NCh()]; @@ -119,6 +135,11 @@ AliMUONv1::AliMUONv1(const char *name, const char* title) fAngleEffectNorma->SetParameter(1,-6.809e-01); fAngleEffectNorma->SetParameter(2,5.151e-02); fAngleEffectNorma->SetParameter(3,-1.490e-03); + + // Magnetic field effect: Normalisation form theta=16 degres (eq. 10 degrees B=0) to theta between -20 and 20 (Lamia Benhabib jun 2006 ) + // Angle with respect to the wires assuming that chambers are perpendicular to the z axis. + fMagAngleEffectNorma = new TF2("MagAngleEffectNorma","121.24/(([1]+[2]*abs(y))+[3]*abs(x-[0]*y)+[4]*abs((x-[0]*y)*(x-[0]*y))+[5]*abs((x-[0]*y)*(x-[0]*y)*(x-[0]*y))+[6]*abs((x-[0]*y)*(x-[0]*y)*(x-[0]*y)*(x-[0]*y)))",-20.0,20.0,-1.,1.); + fMagAngleEffectNorma->SetParameters(8.6995, 25.4022, 13.8822, 2.4717, 1.1551, -0.0624, 0.0012); } //___________________________________________ @@ -132,6 +153,7 @@ AliMUONv1::~AliMUONv1() delete fElossRatio; delete fAngleEffect10; delete fAngleEffectNorma; + delete fMagAngleEffectNorma; } //__________________________________________________ @@ -150,6 +172,19 @@ void AliMUONv1::CreateMaterials() fGeometryBuilder->CreateMaterials(); } +//________________________________________________________________ +void AliMUONv1::UpdateInternalGeometry() +{ +/// Update geometry after applying mis-alignment + + // Load mapping + if ( ! AliMpCDB::LoadMpSegmentation() ) { + AliFatal("Could not access mapping from OCDB !"); + } + + fGeometryBuilder->UpdateInternalGeometry(); +} + //________________________________________________________________ void AliMUONv1::AddAlignableVolumes() const { @@ -175,7 +210,7 @@ void AliMUONv1::Init() // // Build response // - AliMUONResponseFactory respFactory("default"); + AliMUONResponseFactory respFactory("default", fIsTailEffect); respFactory.Build(this); } @@ -283,13 +318,15 @@ void AliMUONv1::StepManager() // Filling TrackRefs file for MUON. Our Track references are the active volume of the chambers if ( (gMC->IsTrackEntering() || gMC->IsTrackExiting() ) ) { AliTrackReference* trackReference - = AddTrackReference(gAlice->GetMCApp()->GetCurrentTrackNumber()); + = AddTrackReference(gAlice->GetMCApp()->GetCurrentTrackNumber(), AliTrackReference::kMUON); trackReference->SetUserId(detElemId); } 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 + if ( fIsMaxStep && (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 } @@ -323,9 +360,10 @@ void AliMUONv1::StepManager() gMC->IsTrackDisappeared()|| (fStepSum[idvol]>fStepMaxInActiveGas) ) { - if ( gMC->IsTrackExiting() || - gMC->IsTrackStop() || - gMC->IsTrackDisappeared() ) gMC->SetMaxStep(kBig); + if ( fIsMaxStep && + ( 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 @@ -385,10 +423,13 @@ void AliMUONv1::StepManager() 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 - + Float_t thetawires = TMath::ASin( TMath::Sin(TMath::Pi()-theta) * TMath::Sin(phi) ) ;// We use Pi-theta because z is negative + Double_t bField[3] = {0}; + fTrackPosition.Vect().GetXYZ(tmp); + TGeoGlobalMagField::Instance()->Field(tmp,bField); - if (fAngleEffect){ + if (fAngleEffect && !fMagEffect){ + thetawires = TMath::Abs(thetawires); if ( (betaxGamma >3.2) && (thetawires*kRaddeg<=15.) ) { betaxGamma=TMath::Log(betaxGamma); eLossParticleELossMip = fElossRatio->Eval(betaxGamma); @@ -401,23 +442,36 @@ void AliMUONv1::StepManager() yAngleEffect=1.e-04*gRandom->Gaus(0,sigmaEffectThetadegrees); // Error due to the angle effect in cm } } - - AliMUONHit hit(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()); + else if (fAngleEffect && fMagEffect) { + if ( (betaxGamma >3.2) && (TMath::Abs(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/fMagAngleEffectNorma->Eval(thetawires*kRaddeg,bField[0]/10.); // 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 + } + } + AliMUONHit hit(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()); + fHitStore->Add(hit); fStepSum[idvol] =0; // Reset for the next event