#include "AliMUONChamber.h"
#include "AliMUONEventReconstructor.h"
#include "AliMUONHitForRec.h"
+#include "AliMUONTriggerTrack.h"
+//#include "AliMUONTriggerConstants.h"
+#include "AliMUONTriggerCircuit.h"
#include "AliMUONRawCluster.h"
+#include "AliMUONLocalTrigger.h"
#include "AliMUONRecoEvent.h"
#include "AliMUONSegment.h"
#include "AliMUONTrack.h"
#include "AliLoader.h"
#include "AliMUONTrackK.h" //AZ
#include <TMatrixD.h> //AZ
+#include "AliMC.h"
//************* Defaults parameters for reconstruction
static const Double_t kDefaultMinBendingMomentum = 3.0;
// Is 10 the right size ????
fRecTracksPtr = new TClonesArray("AliMUONTrack", 10);
fNRecTracks = 0; // really needed or GetEntriesFast sufficient ????
+// trigger tracks
+ fRecTriggerTracksPtr = new TClonesArray("AliMUONTriggerTrack", 10);
+ fNRecTriggerTracks = 0; // really needed or GetEntriesFast sufficient ????
// Memory allocation for the TClonesArray of hits on reconstructed tracks
// Is 100 the right size ????
fRecTrackHitsPtr = new TClonesArray("AliMUONTrack", 100);
fNRecTrackHits = 0; // really needed or GetEntriesFast sufficient ????
- // Sign of fSimpleBValue according to sign of Bx value at (50,50,950).
+ // Sign of fSimpleBValue according to sign of Bx value at (50,50,-950).
Float_t b[3], x[3];
- x[0] = 50.; x[1] = 50.; x[2] = 950.;
+ x[0] = 50.; x[1] = 50.; x[2] = -950.;
gAlice->Field()->Field(x, b);
fSimpleBValue = TMath::Sign(fSimpleBValue,(Double_t) b[0]);
+ fSimpleBPosition = TMath::Sign(fSimpleBPosition,(Double_t) x[2]);
// See how to get fSimple(BValue, BLength, BPosition)
// automatically calculated from the actual magnetic field ????
// Maximum distance in bending plane:
// values from TRACKF_STAT, corresponding to (J psi 20cm),
// scaled to the real distance between chambers in a station
- fSegmentMaxDistBending[0] = 1.5 *
- ((&(pMUON->Chamber(1)))->Z() - (&(pMUON->Chamber(0)))->Z()) / 20.0;
- fSegmentMaxDistBending[1] = 1.5 *
- ((&(pMUON->Chamber(3)))->Z() - (&(pMUON->Chamber(2)))->Z()) / 20.0;
- fSegmentMaxDistBending[2] = 3.0 *
- ((&(pMUON->Chamber(5)))->Z() - (&(pMUON->Chamber(4)))->Z()) / 20.0;
- fSegmentMaxDistBending[3] = 6.0 *
- ((&(pMUON->Chamber(7)))->Z() - (&(pMUON->Chamber(6)))->Z()) / 20.0;
- fSegmentMaxDistBending[4] = 6.0 *
- ((&(pMUON->Chamber(9)))->Z() - (&(pMUON->Chamber(8)))->Z()) / 20.0;
+ fSegmentMaxDistBending[0] = TMath::Abs( 1.5 *
+ ((&(pMUON->Chamber(1)))->Z() - (&(pMUON->Chamber(0)))->Z()) / 20.0);
+ fSegmentMaxDistBending[1] = TMath::Abs( 1.5 *
+ ((&(pMUON->Chamber(3)))->Z() - (&(pMUON->Chamber(2)))->Z()) / 20.0);
+ fSegmentMaxDistBending[2] = TMath::Abs( 3.0 *
+ ((&(pMUON->Chamber(5)))->Z() - (&(pMUON->Chamber(4)))->Z()) / 20.0);
+ fSegmentMaxDistBending[3] = TMath::Abs( 6.0 *
+ ((&(pMUON->Chamber(7)))->Z() - (&(pMUON->Chamber(6)))->Z()) / 20.0);
+ fSegmentMaxDistBending[4] = TMath::Abs( 6.0 *
+ ((&(pMUON->Chamber(9)))->Z() - (&(pMUON->Chamber(8)))->Z()) / 20.0);
fBendingResolution = kDefaultBendingResolution;
fNonBendingResolution = kDefaultNonBendingResolution;
return;
}
+//__________________________________________________________________________
+void AliMUONEventReconstructor::EventReconstructTrigger(void)
+{
+ // To reconstruct one event
+ if (fPrintLevel >= 1) cout << "enter EventReconstructTrigger" << endl;
+ MakeTriggerTracks();
+ return;
+}
+
//__________________________________________________________________________
void AliMUONEventReconstructor::ResetHitsForRec(void)
{
return;
}
+ //__________________________________________________________________________
+void AliMUONEventReconstructor::ResetTriggerTracks(void)
+{
+ // To reset the TClonesArray of reconstructed trigger tracks
+ if (fRecTriggerTracksPtr) fRecTriggerTracksPtr->Delete();
+ // Delete in order that the Track destructors are called,
+ // hence the space for the TClonesArray of pointers to TrackHit's is freed
+ fNRecTriggerTracks = 0;
+ return;
+}
+
//__________________________________________________________________________
void AliMUONEventReconstructor::ResetTrackHits(void)
{
Int_t ihit, nhits=0;
nhits = (Int_t) muondata->Hits()->GetEntriesFast();
AliMUONHit* mHit=0x0;
+
for(ihit=0; ihit<nhits; ihit++) {
mHit = static_cast<AliMUONHit*>(muondata->Hits()->At(ihit));
Int_t ipart = TMath::Abs ((Int_t) mHit->Particle()); //AZ
if (NewHitForRecFromGEANT(mHit,track, hit, 1) && ipart == 13
//if (NewHitForRecFromGEANT(mHit,itrack-1, hit, 1) && ipart == 13
- && itrack <= 2) chamBits |= BIT(mHit->Chamber()-1); //AZ - set bit
+ && itrack <= 2 && !BIT(mHit->Chamber()-1) ) chamBits |= BIT(mHit->Chamber()-1); //AZ - set bit
}
+
if (chamBits&3 && chamBits>>2&3 && chamBits>>4&3 && chamBits>>6&3 &&
chamBits>>8&3 && ((chamBits>>6&3)==3 || (chamBits>>8&3)==3))
fMuons += 1; //AZ
return;
}
+ //__________________________________________________________________________
+void AliMUONEventReconstructor::MakeTriggerTracks(void)
+{
+ // To make the trigger tracks from Local Trigger
+ if (fPrintLevel >= 1) cout << "enter MakeTriggerTracks" << endl;
+ ResetTriggerTracks();
+
+ Int_t nTRentries;
+ TClonesArray *localTrigger;
+ AliMUONLocalTrigger *locTrg;
+ AliMUONTriggerCircuit *circuit;
+ AliMUONTriggerTrack *recTriggerTrack;
+
+ TString evfoldname = AliConfig::fgkDefaultEventFolderName;//to be interfaced properly
+ AliRunLoader* rl = AliRunLoader::GetRunLoader(evfoldname);
+ if (rl == 0x0)
+ {
+ Error("MakeTriggerTracks",
+ "Can not find Run Loader in Event Folder named %s.",
+ evfoldname.Data());
+ return;
+ }
+ AliLoader* gime = rl->GetLoader("MUONLoader");
+ if (gime == 0x0)
+ {
+ Error("MakeTriggerTracks","Can not get MUON Loader from Run Loader.");
+ return;
+ }
+ TTree* TR = gime->TreeR();
+
+ // Loading AliRun master
+ rl->LoadgAlice();
+ gAlice = rl->GetAliRun();
+
+ // Loading MUON subsystem
+ AliMUON * pMUON = (AliMUON *) gAlice->GetDetector("MUON");
+
+ nTRentries = Int_t(TR->GetEntries());
+ if (nTRentries != 1) {
+ cout << "Error in AliMUONEventReconstructor::MakeTriggerTracks"
+ << endl;
+ cout << "nTRentries = " << nTRentries << " not equal to 1" << endl;
+ exit(0);
+ }
+ gime->TreeR()->GetEvent(0); // only one entry
+
+ pMUON->GetMUONData()->SetTreeAddress("GLT");
+ pMUON->GetMUONData()->GetTrigger();
+
+ localTrigger = pMUON->GetMUONData()->LocalTrigger();
+ Int_t nlocals = (Int_t) (localTrigger->GetEntries());
+ Float_t z11 = ( &(pMUON->Chamber(10)) )->Z();
+ Float_t z21 = ( &(pMUON->Chamber(12)) )->Z();
+
+ for (Int_t i=0; i<nlocals; i++) { // loop on Local Trigger
+ locTrg = (AliMUONLocalTrigger*)localTrigger->UncheckedAt(i);
+ circuit = &(pMUON->TriggerCircuit(locTrg->LoCircuit()));
+ Float_t y11 = circuit->GetY11Pos(locTrg->LoStripX());
+ Float_t y21 = circuit->GetY21Pos(locTrg->LoStripX());
+ Float_t x11 = circuit->GetX11Pos(locTrg->LoStripY());
+ Float_t thetax = TMath::ATan2( x11 , z11 );
+ Float_t thetay = TMath::ATan2( (y21-y11) , (z21-z11) );
+
+ recTriggerTrack = new ((*fRecTriggerTracksPtr)[fNRecTriggerTracks])
+ AliMUONTriggerTrack(x11,y11,thetax,thetay,this);
+ fNRecTriggerTracks++;
+ } // end of loop on Local Trigger
+ return;
+}
+
//__________________________________________________________________________
Int_t AliMUONEventReconstructor::MakeTrackCandidatesWithTwoSegments(AliMUONSegment *BegSegment)
{
z, x, y, pX, pY, pZ, c);
}
// informations about generated particles
- np = gAlice->GetNtrack();
+ np = gAlice->GetMCApp()->GetNtrack();
printf(" **** number of generated particles: %d \n", np);
// for (Int_t iPart = 0; iPart < np; iPart++) {
return;
}
+
+//__________________________________________________________________________
+void AliMUONEventReconstructor::EventDumpTrigger(void)
+{
+ // Dump reconstructed trigger event
+ // and the particle parameters
+
+ AliMUONTriggerTrack *triggertrack;
+ Int_t trackIndex;
+
+ if (fPrintLevel >= 1) cout << "****** enter EventDumpTrigger ******" << endl;
+ if (fPrintLevel >= 1) {
+ cout << " Number of Reconstructed tracks :" << fNRecTriggerTracks << endl;
+ }
+ // Loop over reconstructed tracks
+ for (trackIndex = 0; trackIndex < fNRecTriggerTracks; trackIndex++) {
+ triggertrack = (AliMUONTriggerTrack*) ((*fRecTriggerTracksPtr)[trackIndex]);
+ printf(" trigger track number %i x11=%f y11=%f thetax=%f thetay=%f \n",
+ trackIndex,
+ triggertrack->GetX11(),triggertrack->GetY11(),
+ triggertrack->GetThetax(),triggertrack->GetThetay());
+ }
+}
+
+//__________________________________________________________________________
void AliMUONEventReconstructor::FillEvent()
{
// Create a new AliMUONRecoEvent, fill its track list, then add it as a