ROOT logo
// #include "AliMuonForwardTrackAnalysis.h"
// #include "TDatabasePDG.h"
// #include "TGeoGlobalMagField.h"
// #include "TROOT.h"
// #include "AliMagF.h"

enum {kNoOption, kResonanceOnly, kCharmOnly, kBeautyOnly, kBackground1mu, kBackground2mu, kNoResonances};

//=============================================================================================================================================================

void AliMuonForwardTrackAnalysis(const Char_t *readDir= ".",                       // the directory with the MuonGlobalTracks.root and geometry.root files
				 Int_t option = kNoOption,                         // for resonance analysis: kResonanceOnly 
				 Double_t massMin = 0.,                            // lower limit for the cut on dimuon mass
				 Double_t massMax = 10.,                           // upper limit for the cut on dimuon mass
				 Double_t maxChi2SingleMuons = 1.5,                // upper limit for the cut on the single muon chi2
				 Double_t maxOffsetSingleMuons = 1.e9.,            // upper limit for the cut on the single muon offset w.r.t. the primary vtx
				 Bool_t correlateCutOnOffsetChi2 = kTRUE,          // if true, the cut region in the chi2-offset plane for single muons is a quadrant aorund the origin
				 Double_t maxWOffsetMuonPairsAtPrimaryVtx = 1.e9,  // upper limit for the cut on weighted offset of dimuond w.r.t. the primary vtx
				 Double_t maxWOffsetMuonPairsAtPCA = 1.e9,         // upper limit for the cut on weighted offset of dimuond w.r.t. their PCA
				 Double_t maxDistancePrimaryVtxPCA = 1.e9,         // upper limit for the cut on the distance between primary vtx and PCA
				 Double_t minPCAQuality = 0.,                      // lower limit for the cut on the PCA quality
				 Int_t triggerLevel = 1,                           // level of the trigger both muons must satisfy
				 Int_t maxNWrongClusters = 999,                    // maximum number of wrong MFT clusters for a global muon track
				 const Char_t *outDir = ".",                       // directory where the output file will be created
				 Bool_t singleMuonAnalysis = kTRUE,                // if true, the aalysis of single muons will be performed
				 Bool_t muonPairAnalysis = kTRUE,                  // if true, the aalysis of muon pairs will be performed
				 Int_t firstEvent = -1,
				 Int_t lastEvent = -1, 
				 Int_t numTag = 0,                                 // number which will tag the name of the output file
				 Double_t ptMinSingleMuons = 0.0,                  // lower limit for the cut on the single muon pt
				 Double_t trueMass = 3.097,                        // used to evaluate the pseudo proper decay length, usually for J/psi only
				 Bool_t evalDimuonVtxResolution=kFALSE,            // to be set true only if prompt dimuon sources are analyzed
				 Int_t nEventsToMix = 0,                           // if <1 or >100, mixing is not performed
				 const Char_t *tag = "noTag",                      // tag added to the output file name
				 Double_t etaMinSingleMuons = -3.6,                // lower limit for the cut on the single muon eta
				 Double_t etaMaxSingleMuons = -2.5) {              // upper limit for the cut on the single muon eta
  
  const Double_t mJpsi = TDatabasePDG::Instance()->GetParticle("J/psi")->Mass();

  if (trueMass<0) trueMass = mJpsi;
 
  gROOT -> LoadMacro("./AliMuonForwardTrackAnalysis.cxx+");
  //  AliLog::SetClassDebugLevel("AliMuonForwardTrackPair", 1);
  //  AliLog::SetClassDebugLevel("AliMuonForwardTrackAnalysis", 2);

  TGeoGlobalMagField::Instance()->SetField(new AliMagF("Maps","Maps", -1., -1., AliMagF::k5kG));
  
  AliMuonForwardTrackAnalysis *myAnalysis = new AliMuonForwardTrackAnalysis();
  myAnalysis->ReadEvents(firstEvent, lastEvent);
  myAnalysis->SetInputDir(readDir);
  myAnalysis->SetOutputDir(outDir);
  myAnalysis->SetMassRange(massMin, massMax);
  myAnalysis->SetTrueMass(trueMass);
  myAnalysis->SetSingleMuonAnalysis(singleMuonAnalysis);
  myAnalysis->SetMuonPairAnalysis(muonPairAnalysis);
  myAnalysis->SetOption(option);

  myAnalysis->SetMaxNWrongClustersMC(maxNWrongClusters);
  myAnalysis->SetMinPtSingleMuons(ptMinSingleMuons);
  //  myAnalysis->SetEtaRangeSingleMuons(etaMinSingleMuons, etaMaxSingleMuons);
  myAnalysis->SetMaxChi2SingleMuons(maxChi2SingleMuons);
  myAnalysis->SetMaxOffsetSingleMuons(maxOffsetSingleMuons);
  myAnalysis->CorrelateCutOnOffsetChi2(correlateCutOnOffsetChi2);

  myAnalysis->SetMaxWOffsetMuonPairsAtPrimaryVtx(maxWOffsetMuonPairsAtPrimaryVtx);
  myAnalysis->SetMaxWOffsetMuonPairsAtPCA(maxWOffsetMuonPairsAtPCA);
  myAnalysis->SetMaxDistancePrimaryVtxPCA(maxDistancePrimaryVtxPCA);
  myAnalysis->SetMinPCAQuality(minPCAQuality);

  myAnalysis->SetMatchTrigger(triggerLevel);

  myAnalysis->EvalDimuonVtxResolution(evalDimuonVtxResolution);    // it should be true only with prompt dimuon sources

  myAnalysis->SetNEventsToMix(nEventsToMix);

  if (myAnalysis->Init("MuonGlobalTracks.root")) {
    while (myAnalysis->LoadNextEvent()) continue;
    myAnalysis->Terminate(Form("outFiles/outFile.%d.%s.root", numTag, tag));
  }

}

//================================================================================================================================

 AliMuonForwardTrackAnalysis.C:1
 AliMuonForwardTrackAnalysis.C:2
 AliMuonForwardTrackAnalysis.C:3
 AliMuonForwardTrackAnalysis.C:4
 AliMuonForwardTrackAnalysis.C:5
 AliMuonForwardTrackAnalysis.C:6
 AliMuonForwardTrackAnalysis.C:7
 AliMuonForwardTrackAnalysis.C:8
 AliMuonForwardTrackAnalysis.C:9
 AliMuonForwardTrackAnalysis.C:10
 AliMuonForwardTrackAnalysis.C:11
 AliMuonForwardTrackAnalysis.C:12
 AliMuonForwardTrackAnalysis.C:13
 AliMuonForwardTrackAnalysis.C:14
 AliMuonForwardTrackAnalysis.C:15
 AliMuonForwardTrackAnalysis.C:16
 AliMuonForwardTrackAnalysis.C:17
 AliMuonForwardTrackAnalysis.C:18
 AliMuonForwardTrackAnalysis.C:19
 AliMuonForwardTrackAnalysis.C:20
 AliMuonForwardTrackAnalysis.C:21
 AliMuonForwardTrackAnalysis.C:22
 AliMuonForwardTrackAnalysis.C:23
 AliMuonForwardTrackAnalysis.C:24
 AliMuonForwardTrackAnalysis.C:25
 AliMuonForwardTrackAnalysis.C:26
 AliMuonForwardTrackAnalysis.C:27
 AliMuonForwardTrackAnalysis.C:28
 AliMuonForwardTrackAnalysis.C:29
 AliMuonForwardTrackAnalysis.C:30
 AliMuonForwardTrackAnalysis.C:31
 AliMuonForwardTrackAnalysis.C:32
 AliMuonForwardTrackAnalysis.C:33
 AliMuonForwardTrackAnalysis.C:34
 AliMuonForwardTrackAnalysis.C:35
 AliMuonForwardTrackAnalysis.C:36
 AliMuonForwardTrackAnalysis.C:37
 AliMuonForwardTrackAnalysis.C:38
 AliMuonForwardTrackAnalysis.C:39
 AliMuonForwardTrackAnalysis.C:40
 AliMuonForwardTrackAnalysis.C:41
 AliMuonForwardTrackAnalysis.C:42
 AliMuonForwardTrackAnalysis.C:43
 AliMuonForwardTrackAnalysis.C:44
 AliMuonForwardTrackAnalysis.C:45
 AliMuonForwardTrackAnalysis.C:46
 AliMuonForwardTrackAnalysis.C:47
 AliMuonForwardTrackAnalysis.C:48
 AliMuonForwardTrackAnalysis.C:49
 AliMuonForwardTrackAnalysis.C:50
 AliMuonForwardTrackAnalysis.C:51
 AliMuonForwardTrackAnalysis.C:52
 AliMuonForwardTrackAnalysis.C:53
 AliMuonForwardTrackAnalysis.C:54
 AliMuonForwardTrackAnalysis.C:55
 AliMuonForwardTrackAnalysis.C:56
 AliMuonForwardTrackAnalysis.C:57
 AliMuonForwardTrackAnalysis.C:58
 AliMuonForwardTrackAnalysis.C:59
 AliMuonForwardTrackAnalysis.C:60
 AliMuonForwardTrackAnalysis.C:61
 AliMuonForwardTrackAnalysis.C:62
 AliMuonForwardTrackAnalysis.C:63
 AliMuonForwardTrackAnalysis.C:64
 AliMuonForwardTrackAnalysis.C:65
 AliMuonForwardTrackAnalysis.C:66
 AliMuonForwardTrackAnalysis.C:67
 AliMuonForwardTrackAnalysis.C:68
 AliMuonForwardTrackAnalysis.C:69
 AliMuonForwardTrackAnalysis.C:70
 AliMuonForwardTrackAnalysis.C:71
 AliMuonForwardTrackAnalysis.C:72
 AliMuonForwardTrackAnalysis.C:73
 AliMuonForwardTrackAnalysis.C:74
 AliMuonForwardTrackAnalysis.C:75
 AliMuonForwardTrackAnalysis.C:76
 AliMuonForwardTrackAnalysis.C:77
 AliMuonForwardTrackAnalysis.C:78
 AliMuonForwardTrackAnalysis.C:79
 AliMuonForwardTrackAnalysis.C:80
 AliMuonForwardTrackAnalysis.C:81
 AliMuonForwardTrackAnalysis.C:82
 AliMuonForwardTrackAnalysis.C:83
 AliMuonForwardTrackAnalysis.C:84
 AliMuonForwardTrackAnalysis.C:85