X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=MUON%2FAliMUON.cxx;h=0ee4b5cd40e26ed152d2fdb29a485e65d092fb79;hb=ef28fa5fd8429ef6d3b8db343c9870ba532eee4f;hp=7b328f2fef023418e02863347cae0cccbdffcf7e;hpb=c92eb8ad84d9fea19806972ade69abe6956f4e45;p=u%2Fmrichter%2FAliRoot.git diff --git a/MUON/AliMUON.cxx b/MUON/AliMUON.cxx index 7b328f2fef0..0ee4b5cd40e 100644 --- a/MUON/AliMUON.cxx +++ b/MUON/AliMUON.cxx @@ -49,10 +49,18 @@ #include "AliHeader.h" #include "AliHitMap.h" #include "AliLoader.h" +#include "AliESD.h" +#include "AliESDMuonTrack.h" +#include "AliMC.h" #include "AliMUONLoader.h" #include "AliMUON.h" +#include "AliMUONTriggerTrack.h" +#include "AliMUONEventReconstructor.h" +#include "AliMUONClusterReconstructor.h" +#include "AliMUONTrack.h" +#include "AliMUONTrackParam.h" #include "AliMUONChamberTrigger.h" -#include "AliMUONClusterFinderVS.h" +#include "AliMUONClusterFinderAZ.h" #include "AliMUONClusterInput.h" #include "AliMUONConstants.h" #include "AliMUONDigit.h" @@ -66,8 +74,10 @@ #include "AliMUONTransientDigit.h" #include "AliMUONTriggerCircuit.h" #include "AliMUONTriggerDecision.h" +#include "AliMUONVGeometryBuilder.h" #include "AliRun.h" #include "AliMUONDigitizerv1.h" +#include "AliMUONSDigitizerv1.h" // Defaults parameters for Z positions of chambers @@ -94,6 +104,7 @@ AliMUON::AliMUON() fNTrackingCh = 0; fIshunt = 0; fChambers = 0; + fGeometryBuilders = 0; fTriggerCircuits = 0; fAccMin = 0.; fAccMax = 0.; @@ -124,6 +135,8 @@ AliMUON::AliMUON(const char *name, const char *title) // Creating List of Chambers Int_t ch; fChambers = new TObjArray(AliMUONConstants::NCh()); + fGeometryBuilders = new TObjArray(AliMUONConstants::NCh()); + // Loop over stations for (Int_t st = 0; st < AliMUONConstants::NCh() / 2; st++) { // Loop over 2 chambers in the station @@ -138,7 +151,7 @@ AliMUON::AliMUON(const char *name, const char *title) fChambers->AddAt(new AliMUONChamberTrigger(ch),ch); } AliMUONChamber* chamber = (AliMUONChamber*) fChambers->At(ch); - chamber->SetGid(0); + //chamber->SetGid(0); // Default values for Z of chambers chamber->SetZ(AliMUONConstants::DefaultChamberZ(ch)); // @@ -184,6 +197,28 @@ AliMUON::~AliMUON() if(fDebug) printf("%s: Calling AliMUON destructor !!!\n",ClassName()); fIshunt = 0; if (fMerger) delete fMerger; + + if (fGeometryBuilders){ + fGeometryBuilders->Delete(); + delete fGeometryBuilders; + } + if (fChambers){ + fChambers->Delete(); + delete fChambers; + } + if (fTriggerCircuits){ + fTriggerCircuits->Delete(); + delete fTriggerCircuits; + } + delete fMUONData; +} +//_____________________________________________________________________________ +void AliMUON::AddGeometryBuilder(AliMUONVGeometryBuilder* geomBuilder) +{ +// Adds the geometry builder to the list +// --- + + fGeometryBuilders->Add(geomBuilder); } //____________________________________________________________________ void AliMUON::BuildGeometry() @@ -205,8 +240,16 @@ Int_t AliMUON::DistancetoPrimitive(Int_t , Int_t ) void AliMUON::SetTreeAddress() { GetMUONData()->SetLoader(fLoader); - GetMUONData()->SetTreeAddress("H,D,RC"); + // GetMUONData()->MakeBranch("D,S,RC"); + // GetMUONData()->SetTreeAddress("H,D,S,RC"); + GetMUONData()->SetTreeAddress("H"); + + if (fHits != GetMUONData()->Hits()) { + if (gAlice->GetMCApp()) + gAlice->GetMCApp()->AddHitList (fHits); // For purifyKine, only necessary when Hit list is created in AliMUONData + } fHits = GetMUONData()->Hits(); // Added by Ivana to use the methods FisrtHit, NextHit of AliDetector + } //____________________________________________________________________ @@ -313,6 +356,39 @@ void AliMUON::SetAcceptance(Bool_t acc, Float_t angmin, Float_t angmax) } // station loop } } + +//____________________________________________________________________ +Float_t AliMUON::GetMaxStepGas() const +{ +// Return stepsize in gas + + return fMaxStepGas; +} + +//____________________________________________________________________ +Float_t AliMUON::GetMaxStepAlu() const +{ +// Return step size in Alu + + return fMaxStepAlu; +} + +//____________________________________________________________________ +Float_t AliMUON::GetMaxDestepGas() const +{ +// Return maximum step size in Gas + + return fMaxDestepGas; +} + +//____________________________________________________________________ +Float_t AliMUON::GetMaxDestepAlu() const +{ +// Return maximum step size in Gas + + return fMaxDestepAlu; +} + //____________________________________________________________________ void AliMUON::SetSegmentationModel(Int_t id, Int_t isec, AliSegmentation *segmentation) { @@ -364,6 +440,13 @@ void AliMUON::SDigits2Digits() fLoader->TreeD()->Reset(); } +//_____________________________________________________________________ +void AliMUON::Hits2SDigits() +{ + // make SDigits from hits + AliMUONSDigitizerv1 SDigitizer = AliMUONSDigitizerv1(); + SDigitizer.Exec(); // make SDigits for current event +} //_______________________________________________________________________ AliLoader* AliMUON::MakeLoader(const char* topfoldername) { @@ -374,7 +457,6 @@ AliLoader* AliMUON::MakeLoader(const char* topfoldername) Info("MakeLoader", "Creating standard getter for detector %s. Top folder is %s.", GetName(),topfoldername); - fLoader = new AliLoader(GetName(),topfoldername); fMUONData = new AliMUONData(fLoader,GetName(),GetName()); fMUONData->SetSplitLevel(fSplitLevel); @@ -382,7 +464,7 @@ AliLoader* AliMUON::MakeLoader(const char* topfoldername) } //_______________________________________________________________________ -void AliMUON::Trigger(Int_t nev){ +void AliMUON::Trigger(Int_t /*nev*/){ // call the Trigger Algorithm and fill TreeR Int_t singlePlus[3] = {0,0,0}; @@ -392,7 +474,7 @@ void AliMUON::Trigger(Int_t nev){ Int_t pairLike[3] = {0,0,0}; ResetTrigger(); - AliMUONTriggerDecision* decision= new AliMUONTriggerDecision(1); + AliMUONTriggerDecision* decision= new AliMUONTriggerDecision(fLoader,1); decision->Trigger(); decision->GetGlobalTrigger(singlePlus, singleMinus, singleUndef, pairUnlike, pairLike); @@ -429,7 +511,7 @@ void AliMUON::Trigger(Int_t nev){ // fLoader->TreeR()->Reset(); fLoader->WriteRecPoints("OVERWRITE"); - printf("\n End of trigger for event %d", nev); + // printf("\n End of trigger for event %d\n", nev); } //____________________________________________________________________ @@ -468,6 +550,7 @@ void AliMUON::FindClusters() //TClonesArray * muonDigits = GetMUONData()->Digits(ich); ndig=muonDigits->GetEntriesFast(); + if(fDebug) printf("\n 1 Found %d digits in %p chamber %d", ndig, muonDigits,ich); TClonesArray &lhits1 = *dig1; Int_t n = 0; @@ -480,6 +563,7 @@ void AliMUON::FindClusters() GetMUONData()->GetCathode(1); muonDigits = GetMUONData()->Digits(ich); ndig=muonDigits->GetEntriesFast(); + if(fDebug) printf("\n 2 Found %d digits in %p %d", ndig, muonDigits, ich); TClonesArray &lhits2 = *dig2; n=0; @@ -681,4 +765,215 @@ AliMUON& AliMUON::operator = (const AliMUON& /*rhs*/) // dummy version return *this; } +//________________________________________________________________________ +void AliMUON::Reconstruct() const +{ + +// AliLoader* loader = GetLoader(); + + AliRunLoader* runLoader = fLoader->GetRunLoader(); + Int_t nEvents = runLoader->GetNumberOfEvents(); + +// used local container for each method +// passing fLoader as argument, could be avoided ??? + AliMUONEventReconstructor* recoEvent = new AliMUONEventReconstructor(fLoader); + AliMUONData* dataEvent = recoEvent->GetMUONData(); + + AliMUONClusterReconstructor* recoCluster = new AliMUONClusterReconstructor(fLoader); + AliMUONData* dataCluster = recoCluster->GetMUONData(); + + AliMUONTriggerDecision* trigDec = new AliMUONTriggerDecision(fLoader); + AliMUONData* dataTrig = trigDec->GetMUONData(); + + + for (Int_t i = 0; i < 10; i++) { + AliMUONClusterFinderVS *RecModel = new AliMUONClusterFinderVS(); + RecModel->SetGhostChi2Cut(10); + recoCluster->SetReconstructionModel(i,RecModel); + } + + fLoader->LoadDigits("READ"); + fLoader->LoadRecPoints("RECREATE"); + fLoader->LoadTracks("RECREATE"); + + // Loop over events + for(Int_t ievent = 0; ievent < nEvents; ievent++) { + printf("Event %d\n",ievent); + runLoader->GetEvent(ievent); + + //----------------------- digit2cluster & Digits2Trigger ------------------- + if (!fLoader->TreeR()) fLoader->MakeRecPointsContainer(); + + // tracking branch + dataCluster->MakeBranch("RC"); + dataCluster->SetTreeAddress("D,RC"); + recoCluster->Digits2Clusters(); + dataCluster->Fill("RC"); + + // trigger branch + dataTrig->MakeBranch("GLT"); + dataTrig->SetTreeAddress("D,GLT"); + trigDec->Digits2Trigger(); + dataTrig->Fill("GLT"); + + fLoader->WriteRecPoints("OVERWRITE"); + + //---------------------------- Track & TriggerTrack --------------------- + if (!fLoader->TreeT()) fLoader->MakeTracksContainer(); + + // trigger branch + dataEvent->MakeBranch("RL"); //trigger track + dataEvent->SetTreeAddress("RL"); + recoEvent->EventReconstructTrigger(); + dataEvent->Fill("RL"); + + // tracking branch + dataEvent->MakeBranch("RT"); //track + dataEvent->SetTreeAddress("RT"); + recoEvent->EventReconstruct(); + dataEvent->Fill("RT"); + + fLoader->WriteTracks("OVERWRITE"); + + //--------------------------- Resetting branches ----------------------- + dataCluster->ResetDigits(); + dataCluster->ResetRawClusters(); + + dataTrig->ResetDigits(); + dataTrig->ResetTrigger(); + + dataEvent->ResetRawClusters(); + dataEvent->ResetTrigger(); + dataEvent->ResetRecTracks(); + dataEvent->ResetRecTriggerTracks(); + + } + fLoader->UnloadDigits(); + fLoader->UnloadRecPoints(); + fLoader->UnloadTracks(); + + delete recoCluster; + delete recoEvent; + delete trigDec; +} +//________________________________________________________________________ +void AliMUON::FillESD(AliESD* event) const +{ + + TClonesArray* recTracksArray; + TClonesArray* recTrigTracksArray; + + //YS AliLoader* loader = GetLoader(); + AliRunLoader* runLoader = fLoader->GetRunLoader(); //YS loader->GetRunLoader(); + fLoader->LoadTracks("READ"); //YS + + + // declaration + Int_t ievent; + Int_t ntrackhits; + Double_t fitfmin; + + + Double_t bendingSlope, nonBendingSlope, fInverseBendingMomentum; + Double_t fXRec, fYRec, fZRec; + + Float_t x11, y11, thetaX,thetaY ; + + //YS Int_t nEvents = runLoader->GetNumberOfEvents(); + + // setting pointer for tracks, triggertracks& trackparam at vertex + AliMUONTrack * rectrack; + AliMUONTriggerTrack * rectriggertrack; + AliMUONTrackParam *trackParam; + + ievent = runLoader->GetEventNumber() ; //YS, seems not to be implemented yet (Ch. F) + //YS for (ievent = 0; ievent < nEvents; ievent++) { + runLoader->GetEvent(ievent); + + // setting ESD MUON class + AliESDMuonTrack* ESDTrack = new AliESDMuonTrack() ; + + // -------------------- tracks------------- + fMUONData->SetTreeAddress("RT"); + fMUONData->GetRecTracks(); + recTracksArray = fMUONData->RecTracks(); + + Int_t nrectracks = (Int_t) recTracksArray->GetEntriesFast(); // + + //-------------------- trigger tracks------------- + Bool_t ifirst = true; + Long_t trigPat = 0; + fMUONData->SetTreeAddress("RL"); + fMUONData->GetRecTriggerTracks(); + recTrigTracksArray = fMUONData->RecTriggerTracks(); + + Int_t ntrectracks = (Int_t) recTrigTracksArray->GetEntriesFast(); //YS + + //printf(">>> Event %d Number of Recconstructed tracks %d \n",ievent, nrectracks); + + Int_t ntracks = TMath::Max(nrectracks, ntrectracks); + + // loop over tracks + for (Int_t irectracks = 0; irectracks < ntracks; irectracks++) { + + // -------------------- tracks------------- + // not the best way to do, avoid creating two "branches" in fMuonTracks + if (irectracks < nrectracks) { + rectrack = (AliMUONTrack*) recTracksArray->At(irectracks); + + trackParam = rectrack->GetTrackParamAtVertex(); + + bendingSlope = trackParam->GetBendingSlope(); + nonBendingSlope = trackParam->GetNonBendingSlope(); + fInverseBendingMomentum = trackParam->GetInverseBendingMomentum(); + fXRec = trackParam->GetNonBendingCoor(); + fYRec = trackParam->GetBendingCoor(); + fZRec = trackParam->GetZ(); + + ntrackhits = rectrack->GetNTrackHits(); + fitfmin = rectrack->GetFitFMin(); + + // setting data member of ESD MUON + ESDTrack->SetInverseBendingMomentum(fInverseBendingMomentum); + ESDTrack->SetThetaX(TMath::ATan(nonBendingSlope)); + ESDTrack->SetThetaY(TMath::ATan(bendingSlope)); + ESDTrack->SetZ(fZRec); + ESDTrack->SetBendingCoor(fYRec); + ESDTrack->SetNonBendingCoor(fXRec); + ESDTrack->SetChi2(fitfmin); + ESDTrack->SetNHit(ntrackhits); + } + // -------------------- trigger tracks------------- + if (irectracks < ntrectracks) { + rectriggertrack = (AliMUONTriggerTrack*) recTrigTracksArray->At(irectracks); + if (ifirst) { + ifirst = false; + trigPat = rectriggertrack->GetGTPattern(); + } + + x11 = rectriggertrack->GetY11(); + y11 = rectriggertrack->GetY11(); + thetaX = rectriggertrack->GetThetax(); + thetaY = rectriggertrack->GetThetay(); + + // setting data member of ESD MUON trigger + ESDTrack->SetThetaX11(thetaX); + ESDTrack->SetThetaY11(thetaY); + ESDTrack->SetX11(x11); + ESDTrack->SetY11(y11); + } + // storing ESD MUON Track into ESD Event & reset muondata + if (ntrectracks+ntrectracks != 0) + event->AddMuonTrack(ESDTrack); + } // end loop tracks + + // if (ntrectracks+ntrectracks != 0) + // event->SetTrigger(trigPat); + // Waiting for STEER update + fMUONData->ResetRecTracks(); + fMUONData->ResetRecTriggerTracks(); + + //} // end loop on event + fLoader->UnloadTracks(); +}