#include "AliHeader.h"
#include "AliHitMap.h"
#include "AliLoader.h"
+#include "AliRunDigitizer.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"
#include "AliMUONTransientDigit.h"
#include "AliMUONTriggerCircuit.h"
#include "AliMUONTriggerDecision.h"
+#include "AliMUONVGeometryBuilder.h"
#include "AliRun.h"
+#include "AliMUONDigitizerv2.h"
+#include "AliMUONSDigitizerv1.h"
// Defaults parameters for Z positions of chambers
fNTrackingCh = 0;
fIshunt = 0;
fChambers = 0;
+ fGeometryBuilders = 0;
fTriggerCircuits = 0;
fAccMin = 0.;
fAccMax = 0.;
fAccCut = kFALSE;
fMerger = 0;
fFileName = 0;
+ fMUONData = 0;
+ fSplitLevel = 0;
}
//__________________________________________________________________
AliMUON::AliMUON(const char *name, const char *title)
*/
//End_Html
fMUONData = 0x0;
+ fSplitLevel= 0;
fIshunt = 0;
fNCh = AliMUONConstants::NCh();
// 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
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));
//
} // Chamber stCH (0, 1) in
} // Station st (0...)
- fMaxStepGas=0.01;
- fMaxStepAlu=0.1;
+ // Negatives values are ignored by geant3 CONS200 in the calculation of the tracking parameters
+ fMaxStepGas=0.1;
+ fMaxStepAlu=0.1;
fMaxDestepGas=-1;
fMaxDestepAlu=-1;
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()
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() )
+ if ( gAlice->GetMCApp()->GetHitLists() ) {
+ fHits = GetMUONData()->Hits();
+ 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
}
//____________________________________________________________________
for (Int_t stCH = 0; stCH < 2; stCH++) {
ch = 2 * st + stCH;
// Set chamber inner and outer radius according to acceptance cuts
- Chamber(ch).SetRInner(AliMUONConstants::DefaultChamberZ(ch)*TMath::Tan(fAccMin));
- Chamber(ch).SetROuter(AliMUONConstants::DefaultChamberZ(ch)*TMath::Tan(fAccMax));
+ Chamber(ch).SetRInner(TMath::Abs(AliMUONConstants::DefaultChamberZ(ch)*TMath::Tan(fAccMin)));
+ Chamber(ch).SetROuter(TMath::Abs(AliMUONConstants::DefaultChamberZ(ch)*TMath::Tan(fAccMax)));
} // chamber loop
} // 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)
{
// Set number of segmented cathods for chamber id
((AliMUONChamber*) fChambers->At(id))->SetNsec(nsec);
}
+//____________________________________________________________________
+AliDigitizer* AliMUON::CreateDigitizer(AliRunDigitizer* manager) const
+{
+ return new AliMUONDigitizerv2(manager);
+}
//_____________________________________________________________________
void AliMUON::SDigits2Digits()
{
fLoader->TreeD()->Reset();
}
+//_____________________________________________________________________
+void AliMUON::Hits2SDigits()
+{
+ // Adaption of AliMUONSDigitizerv1 to be excuted by the AliSimulation framework
+ AliRunLoader* runLoader = fLoader->GetRunLoader();
+ AliRunDigitizer * manager = new AliRunDigitizer(1,1);
+ manager->SetInputStream(0,runLoader->GetFileName(),AliConfig::GetDefaultEventFolderName());
+ AliMUONDigitizer * dMUON = new AliMUONSDigitizerv1(manager);
+ fLoader->LoadHits("READ");
+ for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
+ runLoader->GetEvent(iEvent);
+ dMUON->Exec("");
+ }
+ fLoader->UnloadHits();
+}
//_______________________________________________________________________
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);
return fLoader;
}
//_______________________________________________________________________
-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};
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);
delete decision;
- fLoader->TreeR()->Fill();
-
+ // fLoader->TreeR()->Fill();
+ GetMUONData()->Fill("GLT"); //Filling Global and Local Trigger GLT
// char hname[30];
// sprintf(hname,"TreeR%d",nev);
// fLoader->TreeR()->Write(hname,TObject::kOverwrite);
// 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);
}
//____________________________________________________________________
{
FindClusters();
Int_t nev = gAlice->GetHeader()->GetEvent();
- fLoader->TreeR()->Fill();
- // char hname[30];
- // sprintf(hname,"TreeR%d", nev);
- //fLoader->TreeR()->Write(hname);
- //fLoader->TreeR()->Reset();
+ GetMUONData()->Fill("RC"); //Filling Reconstructed Cluster
fLoader->WriteRecPoints("OVERWRITE");
GetMUONData()->ResetRawClusters();
- printf("\n End of cluster finding for event %d", nev);
+ Info("Digits2Reco","End of cluster finding for event %d", nev);
}
//____________________________________________________________________
void AliMUON::FindClusters()
AliMUONClusterFinderVS* rec = iChamber->ReconstructionModel();
ResetDigits();
- fLoader->TreeD()->GetEvent(0);
+ GetMUONData()->GetCathode(0);
//TClonesArray *
- muonDigits = GetMUONData()->Digits(ich,0); // cathode plane not yet operational
+ 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;
if (rec->TestTrack(digit->Track(0)))
new(lhits1[n++]) AliMUONDigit(*digit);
}
- ResetDigits();
- fLoader->TreeD()->GetEvent(1);
- //muonDigits = this->DigitsAddress(ich);
- muonDigits = GetMUONData()->Digits(ich,1); // cathode plane not yet operational
+ GetMUONData()->ResetDigits();
+ 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;
// 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();
+ fLoader->LoadTracks("READ"); //YS
+
+
+ // declaration
+ Int_t iEvent;
+ Int_t nTrackHits;
+ Double_t fitFmin;
+
+
+ Double_t bendingSlope, nonBendingSlope, inverseBendingMomentum;
+ Double_t xRec, yRec, zRec, chi2MatchTrigger;
+ Bool_t matchTrigger;
+
+ //YS Int_t nEvents = runLoader->GetNumberOfEvents();
+
+ // setting pointer for tracks, triggertracks& trackparam at vertex
+ AliMUONTrack* recTrack;
+ AliMUONTrackParam* trackParam;
+ AliMUONTriggerTrack* recTriggerTrack;
+
+ iEvent = runLoader->GetEventNumber() ; //YS, seems not to be implemented yet (Ch. F)
+ runLoader->GetEvent(iEvent);
+
+ // setting ESD MUON class
+ AliESDMuonTrack* ESDTrack = new AliESDMuonTrack() ;
+
+ //-------------------- trigger tracks-------------
+ Long_t trigPat = 0;
+ fMUONData->SetTreeAddress("RL");
+ fMUONData->GetRecTriggerTracks();
+ recTrigTracksArray = fMUONData->RecTriggerTracks();
+
+ // ready global trigger pattern from first track
+ recTriggerTrack = (AliMUONTriggerTrack*) recTrigTracksArray->First();
+ trigPat = recTriggerTrack->GetGTPattern();
+
+ //printf(">>> Event %d Number of Recconstructed tracks %d \n",iEvent, nrectracks);
+
+ // -------------------- tracks-------------
+ fMUONData->SetTreeAddress("RT");
+ fMUONData->GetRecTracks();
+ recTracksArray = fMUONData->RecTracks();
+
+ Int_t nRecTracks = (Int_t) recTracksArray->GetEntriesFast(); //
+
+ // loop over tracks
+ for (Int_t iRecTracks = 0; iRecTracks < nRecTracks; iRecTracks++) {
+
+ // reading info from tracks
+ recTrack = (AliMUONTrack*) recTracksArray->At(iRecTracks);
+
+ trackParam = recTrack->GetTrackParamAtVertex();
+
+ bendingSlope = trackParam->GetBendingSlope();
+ nonBendingSlope = trackParam->GetNonBendingSlope();
+ inverseBendingMomentum = trackParam->GetInverseBendingMomentum();
+ xRec = trackParam->GetNonBendingCoor();
+ yRec = trackParam->GetBendingCoor();
+ zRec = trackParam->GetZ();
+
+ nTrackHits = recTrack->GetNTrackHits();
+ fitFmin = recTrack->GetFitFMin();
+ matchTrigger = recTrack->GetMatchTrigger();
+ chi2MatchTrigger = recTrack->GetChi2MatchTrigger();
+
+ // setting data member of ESD MUON
+ ESDTrack->SetInverseBendingMomentum(inverseBendingMomentum);
+ ESDTrack->SetThetaX(TMath::ATan(nonBendingSlope));
+ ESDTrack->SetThetaY(TMath::ATan(bendingSlope));
+ ESDTrack->SetZ(zRec);
+ ESDTrack->SetBendingCoor(yRec);
+ ESDTrack->SetNonBendingCoor(xRec);
+ ESDTrack->SetChi2(fitFmin);
+ ESDTrack->SetNHit(nTrackHits);
+ ESDTrack->SetMatchTrigger(matchTrigger);
+ ESDTrack->SetChi2MatchTrigger(chi2MatchTrigger);
+
+ // storing ESD MUON Track into ESD Event
+ if (nRecTracks != 0)
+ event->AddMuonTrack(ESDTrack);
+ } // end loop tracks
+
+ // add global trigger pattern
+ if (nRecTracks != 0)
+ event->SetTrigger(trigPat);
+
+ // reset muondata
+ fMUONData->ResetRecTracks();
+ fMUONData->ResetRecTriggerTracks();
+
+ //} // end loop on event
+ fLoader->UnloadTracks();
+}