* about the suitability of this software for any purpose. It is *
* provided "as is" without express or implied warranty. *
**************************************************************************/
-/*
-$Log$
-Revision 1.53 2001/07/20 10:03:13 morsch
-Changes needed to work with Root 3.01 (substitute lhs [] operator). (Jiri Chudoba)
-
-Revision 1.52 2001/06/14 13:49:22 hristov
-Write a TreeD in SDigits2Digits method (needed to be compatible with alirun script)
-
-Revision 1.51 2001/05/31 10:19:52 morsch
-Fix for new AliRun::RunReco().
-
-Revision 1.50 2001/05/16 14:57:17 alibrary
-New files for folders and Stack
-
-Revision 1.49 2001/03/12 17:45:48 hristov
-Changes needed on Sun with CC 5.0
-
-Revision 1.48 2001/03/06 00:01:36 morsch
-Add Digits2Reco() and FindClusters()
-Adapt call of cluster finder to new STEER.
-
-Revision 1.47 2001/03/05 08:38:36 morsch
-Digitization related methods moved to AliMUONMerger.
-
-Revision 1.46 2001/01/26 21:34:59 morsch
-Use access functions for AliMUONHit, AliMUONDigit and AliMUONPadHit data members.
-
-Revision 1.45 2001/01/26 20:00:49 hristov
-Major upgrade of AliRoot code
-
-Revision 1.44 2001/01/25 17:39:09 morsch
-Pass size of fNdch and fNrawch to CINT.
-
-Revision 1.43 2001/01/23 18:58:19 hristov
-Initialisation of some pointers
-
-Revision 1.42 2001/01/17 20:53:40 hristov
-Destructors corrected to avoid memory leaks
-
-Revision 1.41 2000/12/21 22:12:40 morsch
-Clean-up of coding rule violations,
-
-Revision 1.40 2000/11/29 20:32:26 gosset
-Digitize:
-1. correction for array index out of bounds
-2. one printout commented
-
-Revision 1.39 2000/11/12 17:17:03 pcrochet
-BuildGeometry of AliMUON for trigger chambers delegated to AliMUONSegmentationTriggerX (same strategy as for tracking chambers)
-
-Revision 1.38 2000/11/06 09:20:43 morsch
-AliMUON delegates part of BuildGeometry() to AliMUONSegmentation using the
-Draw() method. This avoids code and parameter replication.
-
-Revision 1.37 2000/10/26 09:53:37 pcrochet
-put back trigger chambers in the display (there was a problem in buildgeometry)
-
-Revision 1.36 2000/10/25 19:51:18 morsch
-Correct x-position of chambers.
-
-Revision 1.35 2000/10/24 19:46:21 morsch
-BuildGeometry updated for slats in station 3-4.
-
-Revision 1.34 2000/10/18 11:42:06 morsch
-- AliMUONRawCluster contains z-position.
-- Some clean-up of useless print statements during initialisations.
-
-Revision 1.33 2000/10/09 14:01:57 morsch
-Unused variables removed.
-
-Revision 1.32 2000/10/06 09:08:10 morsch
-Built geometry includes slat geometry for event display.
-
-Revision 1.31 2000/10/02 21:28:08 fca
-Removal of useless dependecies via forward declarations
-
-Revision 1.30 2000/10/02 16:58:29 egangler
-Cleaning of the code :
--> coding conventions
--> void Streamers
--> some useless includes removed or replaced by "class" statement
-
-Revision 1.29 2000/07/28 13:49:38 morsch
-SetAcceptance defines inner and outer chamber radii according to angular acceptance.
-Can be used for simple acceptance studies.
-
-Revision 1.28 2000/07/22 16:43:15 morsch
-Same comment as before, but now done correctly I hope (sorry it's Saturday evening)
-
-Revision 1.27 2000/07/22 16:36:50 morsch
-Change order of indices in creation (new) of xhit and yhit
-
-Revision 1.26 2000/07/03 11:54:57 morsch
-AliMUONSegmentation and AliMUONHitMap have been replaced by AliSegmentation and AliHitMap in STEER
-The methods GetPadIxy and GetPadXxy of AliMUONSegmentation have changed name to GetPadI and GetPadC.
-
-Revision 1.25 2000/06/29 12:34:09 morsch
-AliMUONSegmentation class has been made independent of AliMUONChamber. This makes
-it usable with any other geometry class. The link to the object to which it belongs is
-established via an index. This assumes that there exists a global geometry manager
-from which the pointer to the parent object can be obtained (in our case gAlice).
-
-Revision 1.24 2000/06/28 15:16:35 morsch
-(1) Client code adapted to new method signatures in AliMUONSegmentation (see comments there)
-to allow development of slat-muon chamber simulation and reconstruction code in the MUON
-framework. The changes should have no side effects (mostly dummy arguments).
-(2) Hit disintegration uses 3-dim hit coordinates to allow simulation
-of chambers with overlapping modules (MakePadHits, Disintegration).
-
-Revision 1.23 2000/06/28 12:19:17 morsch
-More consequent seperation of global input data services (AliMUONClusterInput singleton) and the
-cluster and hit reconstruction algorithms in AliMUONClusterFindRawinderVS.
-AliMUONClusterFinderVS becomes the base class for clustering and hit reconstruction.
-It requires two cathode planes. Small modifications in the code will make it usable for
-one cathode plane and, hence, more general (for test beam data).
-AliMUONClusterFinder is now obsolete.
-
-Revision 1.22 2000/06/28 08:06:10 morsch
-Avoid global variables in AliMUONClusterFinderVS by seperating the input data for the fit from the
-algorithmic part of the class. Input data resides inside the AliMUONClusterInput singleton.
-It also naturally takes care of the TMinuit instance.
-
-Revision 1.21 2000/06/27 08:54:41 morsch
-Problems with on constant array sizes (in hitMap, nmuon, xhit, yhit) corrected.
-
-Revision 1.20 2000/06/26 14:02:38 morsch
-Add class AliMUONConstants with MUON specific constants using static memeber data and access methods.
-
-Revision 1.19 2000/06/22 13:40:51 morsch
-scope problem on HP, "i" declared once
-pow changed to TMath::Power (PH, AM)
-
-Revision 1.18 2000/06/15 07:58:48 morsch
-Code from MUON-dev joined
-
-Revision 1.14.4.17 2000/06/14 14:36:46 morsch
-- add TriggerCircuit (PC)
-- add GlobalTrigger and LocalTrigger and specific methods (PC)
-
-Revision 1.14.4.16 2000/06/09 21:20:28 morsch
-Most coding rule violations corrected
-
-Revision 1.14.4.15 2000/05/02 09:54:32 morsch
-RULE RN17 violations corrected
-
-Revision 1.14.4.12 2000/04/26 12:25:02 morsch
-Code revised by P. Crochet:
-- Z position of TriggerChamber changed according to A.Tournaire Priv.Comm.
-- ToF included in the method MakePadHits
-- inner radius of flange between beam shielding and trigger corrected
-- Trigger global volume updated (according to the new geometry)
-
-Revision 1.14.4.11 2000/04/19 19:42:08 morsch
-Some changes of variable names curing viols and methods concerning
-correlated clusters removed.
-
-Revision 1.14.4.10 2000/03/22 16:44:07 gosset
-Memory leak suppressed in function Digitise:
-p_adr->Delete() instead of Clear (I.Chevrot and A.Baldisseri)
-
-Revision 1.14.4.9 2000/03/20 18:15:25 morsch
-Positions of trigger chambers corrected (P.C.)
-
-Revision 1.14.4.8 2000/02/21 15:38:01 morsch
-Call to AddHitList introduced to make this version compatible with head.
-
-Revision 1.14.4.7 2000/02/20 07:45:53 morsch
-Bugs in Trigger part of BuildGeomemetry corrected (P.C)
-
-Revision 1.14.4.6 2000/02/17 14:28:54 morsch
-Trigger included into initialization and digitization
-Revision 1.14.4.5 2000/02/15 10:02:58 morsch
-Log messages of previous revisions added
-
-Revision 1.14.4.2 2000/02/04 10:57:34 gosset
-Z position of the chambers:
-it was the Z position of the stations;
-it is now really the Z position of the chambers.
- !!!! WARNING: THE CALLS TO "AliMUONChamber::SetZPOS"
- !!!! AND "AliMUONChamber::ZPosition"
- !!!! HAVE TO BE CHANGED TO "AliMUONChamber::"SetZ"
- !!!! AND "AliMUONChamber::Z"
-
-Revision 1.14.4.3 2000/02/04 16:19:04 gosset
-Correction for mis-spelling of NCH
-
-Revision 1.14.4.4 2000/02/15 09:43:38 morsch
-Log message added
-
-*/
+/* $Id$ */
///////////////////////////////////////////////
// Manager and hits classes for set:MUON //
////////////////////////////////////////////////
-#include <TTUBE.h>
+#include "Riostream.h"
+
+#include <AliPDG.h>
#include <TBRIK.h>
-#include <TRotMatrix.h>
+#include <TCanvas.h>
+#include <TDirectory.h>
+#include <TFile.h>
#include <TGeometry.h>
+#include <TMinuit.h>
#include <TNode.h>
-#include <TTree.h>
-#include <TRandom.h>
-#include <TObject.h>
-#include <TVector.h>
+#include <TNtuple.h>
#include <TObjArray.h>
-#include <TMinuit.h>
+#include <TObject.h>
+#include <TObjectTable.h>
+#include <TPad.h>
#include <TParticle.h>
#include <TROOT.h>
-#include <TFile.h>
-#include <TNtuple.h>
-#include <TCanvas.h>
-#include <TPad.h>
-#include <TDirectory.h>
-#include <TObjectTable.h>
-#include <AliPDG.h>
+#include <TRandom.h>
+#include <TRotMatrix.h>
#include <TTUBE.h>
+#include <TTUBE.h>
+#include <TTree.h>
+#include <TVector.h>
+#include <TVirtualMC.h>
+#include "AliConst.h"
+#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 "AliMUONClusterFinderAZ.h"
+#include "AliMUONClusterInput.h"
+#include "AliMUONConstants.h"
+#include "AliMUONDigit.h"
+#include "AliMUONGlobalTrigger.h"
#include "AliMUONHit.h"
+#include "AliMUONHitMapA1.h"
+#include "AliMUONLocalTrigger.h"
+#include "AliMUONMerger.h"
#include "AliMUONPadHit.h"
-#include "AliMUONDigit.h"
-#include "AliMUONTransientDigit.h"
#include "AliMUONRawCluster.h"
-#include "AliMUONLocalTrigger.h"
-#include "AliMUONGlobalTrigger.h"
+#include "AliMUONTransientDigit.h"
#include "AliMUONTriggerCircuit.h"
-#include "AliHitMap.h"
-#include "AliMUONHitMapA1.h"
-#include "AliMUONChamberTrigger.h"
-#include "AliMUONConstants.h"
-#include "AliMUONClusterFinderVS.h"
#include "AliMUONTriggerDecision.h"
-#include "AliRun.h"
-#include "AliHeader.h"
-#include "AliMC.h"
-#include "AliMUONClusterInput.h"
-#include "AliMUONMerger.h"
-#include "iostream.h"
-#include "AliCallf77.h"
-#include "AliConst.h"
+#include "AliMUONVGeometryBuilder.h"
+#include "AliRun.h"
+#include "AliMUONDigitizerv2.h"
+#include "AliMUONSDigitizerv1.h"
+
// Defaults parameters for Z positions of chambers
// taken from values for "stations" in AliMUON::AliMUON
// for the first and second chambers in the station, respectively
ClassImp(AliMUON)
-//___________________________________________
+//__________________________________________________________________
AliMUON::AliMUON()
{
// Default Constructor
fNCh = 0;
fNTrackingCh = 0;
fIshunt = 0;
- fHits = 0;
- fPadHits = 0;
- fNPadHits = 0;
fChambers = 0;
- fDchambers = 0;
- fTriggerCircuits = 0;
- fNdch = 0;
- fRawClusters = 0;
- fNrawch = 0;
- fGlobalTrigger = 0;
- fNLocalTrigger = 0;
- fLocalTrigger = 0;
- fNLocalTrigger = 0;
+ fGeometryBuilders = 0;
+ fTriggerCircuits = 0;
fAccMin = 0.;
fAccMax = 0.;
fAccCut = kFALSE;
fMerger = 0;
+ fMUONData = 0;
+ fSplitLevel = 0;
}
-
-//___________________________________________
+//__________________________________________________________________
AliMUON::AliMUON(const char *name, const char *title)
- : AliDetector(name,title)
+ : AliDetector(name,title)
{
//Begin_Html
/*
<img src="gif/alimuon.gif">
*/
//End_Html
+ fMUONData = 0x0;
+ fSplitLevel= 0;
+ fIshunt = 0;
- fHits = new TClonesArray("AliMUONHit",1000);
- gAlice->AddHitList(fHits);
- fPadHits = new TClonesArray("AliMUONPadHit",10000);
- fNPadHits = 0;
- fIshunt = 0;
-
- fNCh = AliMUONConstants::NCh();
- fNTrackingCh = AliMUONConstants::NTrackingCh();
- fNdch = new Int_t[fNCh];
-
- fDchambers = new TObjArray(AliMUONConstants::NCh());
-
- Int_t i;
-
- for (i=0; i<AliMUONConstants::NCh() ;i++) {
- fDchambers->AddAt(new TClonesArray("AliMUONDigit",10000),i);
- fNdch[i]=0;
- }
-
- fNrawch = new Int_t[fNTrackingCh];
-
- fRawClusters = new TObjArray(AliMUONConstants::NTrackingCh());
-
- for (i=0; i<AliMUONConstants::NTrackingCh();i++) {
- fRawClusters->AddAt(new TClonesArray("AliMUONRawCluster",10000),i);
- fNrawch[i]=0;
- }
-
- fGlobalTrigger = new TClonesArray("AliMUONGlobalTrigger",1);
- fNGlobalTrigger = 0;
- fLocalTrigger = new TClonesArray("AliMUONLocalTrigger",234);
- fNLocalTrigger = 0;
+ fNCh = AliMUONConstants::NCh();
+ fNTrackingCh = AliMUONConstants::NTrackingCh();
- SetMarkerColor(kRed);
+ SetMarkerColor(kRed);//
//
-//
-//
-//
-
+// 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
- for (Int_t stCH = 0; stCH < 2; stCH++) {
-//
-//
-// Default Parameters for Muon Tracking Stations
-
-
- ch = 2 * st + stCH;
-//
- if (ch < AliMUONConstants::NTrackingCh()) {
- fChambers->AddAt(new AliMUONChamber(ch),ch);
- } else {
- fChambers->AddAt(new AliMUONChamberTrigger(ch),ch);
- }
-
- //PH AliMUONChamber* chamber = (AliMUONChamber*) (*fChambers)[ch];
- AliMUONChamber* chamber = (AliMUONChamber*) fChambers->At(ch);
-
- chamber->SetGid(0);
- // Default values for Z of chambers
- chamber->SetZ(AliMUONConstants::DefaultChamberZ(ch));
-//
- chamber->InitGeo(AliMUONConstants::DefaultChamberZ(ch));
-// Set chamber inner and outer radius to default
- chamber->SetRInner(AliMUONConstants::Dmin(st)/2);
- chamber->SetROuter(AliMUONConstants::Dmax(st)/2);
-//
- } // Chamber stCH (0, 1) in
+ for (Int_t stCH = 0; stCH < 2; stCH++) {
+ //
+ //
+ // Default Parameters for Muon Tracking Stations
+ ch = 2 * st + stCH;
+ if (ch < AliMUONConstants::NTrackingCh()) {
+ fChambers->AddAt(new AliMUONChamber(ch),ch);
+ } else {
+ fChambers->AddAt(new AliMUONChamberTrigger(ch),ch);
+ }
+ AliMUONChamber* chamber = (AliMUONChamber*) fChambers->At(ch);
+ //chamber->SetGid(0);
+ // Default values for Z of chambers
+ chamber->SetZ(AliMUONConstants::DefaultChamberZ(ch));
+ //
+ chamber->InitGeo(AliMUONConstants::DefaultChamberZ(ch));
+ // Set chamber inner and outer radius to default
+ chamber->SetRInner(AliMUONConstants::Dmin(st)/2);
+ chamber->SetROuter(AliMUONConstants::Dmax(st)/2);
+ //
+ } // Chamber stCH (0, 1) in
} // Station st (0...)
-// fChambers->SetLast(AliMUONConstants::NCh());
- 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;
-//
- fMaxIterPad = 0;
- fCurIterPad = 0;
-//
- fAccMin = 0.;
- fAccMax = 0.;
- fAccCut = kFALSE;
-
- // cp new design of AliMUONTriggerDecision
- fTriggerCircuits = new TObjArray(AliMUONConstants::NTriggerCircuit());
- for (Int_t circ=0; circ<AliMUONConstants::NTriggerCircuit(); circ++) {
- fTriggerCircuits->AddAt(new AliMUONTriggerCircuit(),circ);
-
- }
- fMerger = 0;
+
+ fMaxIterPad = 0;
+ fCurIterPad = 0;
+
+ fAccMin = 0.;
+ fAccMax = 0.;
+ fAccCut = kFALSE;
+
+ // cp new design of AliMUONTriggerDecision
+ fTriggerCircuits = new TObjArray(AliMUONConstants::NTriggerCircuit());
+ for (Int_t circ=0; circ<AliMUONConstants::NTriggerCircuit(); circ++) {
+ fTriggerCircuits->AddAt(new AliMUONTriggerCircuit(),circ);
+ }
+ fMerger = 0;
}
-
-//___________________________________________
-AliMUON::AliMUON(const AliMUON& rMUON)
+//____________________________________________________________________
+AliMUON::AliMUON(const AliMUON& rMUON):AliDetector(rMUON)
{
// Dummy copy constructor
;
}
-
+//____________________________________________________________________
AliMUON::~AliMUON()
{
// Destructor
- if(fDebug) printf("%s: Calling AliMUON destructor !!!\n",ClassName());
-
- Int_t i;
- fIshunt = 0;
-
- // Delete TObjArrays
-
- if (fChambers){
- fChambers->Delete();
- delete fChambers;
- }
-
- if (fTriggerCircuits){
- fTriggerCircuits->Delete();
- delete fTriggerCircuits;
- }
-
- if (fDchambers){
- fDchambers->Delete();
- delete fDchambers;
- }
-
- if (fRawClusters){
- fRawClusters->Delete();
- delete fRawClusters;
- }
- for (i=0;i<AliMUONConstants::NTrackingCh();i++) {
- fNrawch[i]=0;
- }
-
- // Delete TClonesArrays
-
- if (fPadHits){
- fPadHits->Delete();
- delete fPadHits;
- }
-
- if (fGlobalTrigger){
- fGlobalTrigger->Delete();
- delete fGlobalTrigger;
- }
- fNGlobalTrigger = 0;
-
- if (fLocalTrigger){
- fLocalTrigger->Delete();
- delete fLocalTrigger;
- }
- fNLocalTrigger = 0;
-
- if (fHits2){
- fHits2->Delete();
- delete fHits2;
- }
-
- if (fPadHits2){
- fPadHits2->Delete();
- delete fPadHits2;
- }
-
- if (fHits) {
- fHits->Delete();
- delete fHits;
- }
-
- // Delete hits tree for background event
+ if(fDebug) printf("%s: Calling AliMUON destructor !!!\n",ClassName());
+ fIshunt = 0;
+ if (fMerger) delete fMerger;
- if (fTrH1) {
- fTrH1->Delete();
- delete fTrH1;
- }
-
- if (fMerger) delete fMerger;
-}
-
-//___________________________________________
-void AliMUON::AddHit(Int_t track, Int_t *vol, Float_t *hits)
-{
- TClonesArray &lhits = *fHits;
- new(lhits[fNhits++]) AliMUONHit(fIshunt,track,vol,hits);
-}
-//___________________________________________
-void AliMUON::AddPadHit(Int_t *clhits)
-{
- TClonesArray &lclusters = *fPadHits;
- new(lclusters[fNPadHits++]) AliMUONPadHit(clhits);
-}
-//_____________________________________________________________________________
-void AliMUON::AddDigits(Int_t id, Int_t *tracks, Int_t *charges, Int_t *digits)
-{
- //
- // Add a MUON digit to the list
- //
-
- //PH TClonesArray &ldigits = *((TClonesArray*)(*fDchambers)[id]);
- TClonesArray &ldigits = *((TClonesArray*)fDchambers->At(id));
- new(ldigits[fNdch[id]++]) AliMUONDigit(tracks,charges,digits);
+ if (fGeometryBuilders){
+ fGeometryBuilders->Delete();
+ delete fGeometryBuilders;
+ }
+ if (fChambers){
+ fChambers->Delete();
+ delete fChambers;
+ }
+ if (fTriggerCircuits){
+ fTriggerCircuits->Delete();
+ delete fTriggerCircuits;
+ }
+ delete fMUONData;
}
-
//_____________________________________________________________________________
-void AliMUON::AddRawCluster(Int_t id, const AliMUONRawCluster& c)
+void AliMUON::AddGeometryBuilder(AliMUONVGeometryBuilder* geomBuilder)
{
- //
- // Add a MUON digit to the list
- //
+// Adds the geometry builder to the list
+// ---
- //PH TClonesArray &lrawcl = *((TClonesArray*)(*fRawClusters)[id]);
- TClonesArray &lrawcl = *((TClonesArray*)fRawClusters->At(id));
- new(lrawcl[fNrawch[id]++]) AliMUONRawCluster(c);
+ fGeometryBuilders->Add(geomBuilder);
}
-
-//___________________________________________
-void AliMUON::AddGlobalTrigger(Int_t *singlePlus, Int_t *singleMinus,
- Int_t *singleUndef,
- Int_t *pairUnlike, Int_t *pairLike)
-{
-// add a MUON Global Trigger to the list (only one GlobalTrigger per event !)
- TClonesArray &globalTrigger = *fGlobalTrigger;
- new(globalTrigger[fNGlobalTrigger++])
- AliMUONGlobalTrigger(singlePlus, singleMinus, singleUndef, pairUnlike,
- pairLike);
-}
-//___________________________________________
-void AliMUON::AddLocalTrigger(Int_t *localtr)
-{
-// add a MUON Local Trigger to the list
- TClonesArray &localTrigger = *fLocalTrigger;
- new(localTrigger[fNLocalTrigger++]) AliMUONLocalTrigger(localtr);
-}
-
-//___________________________________________
+//____________________________________________________________________
void AliMUON::BuildGeometry()
{
// Geometry for event display
}
}
}
-
-//___________________________________________
+//___________________________________________________________________
Int_t AliMUON::DistancetoPrimitive(Int_t , Int_t )
{
- return 9999;
-}
-
-//___________________________________________
-void AliMUON::MakeBranch(Option_t* option, const char *file)
-{
- //
- // Create Tree branches for the MUON.
- //
- const Int_t kBufferSize = 4000;
- char branchname[30];
- sprintf(branchname,"%sCluster",GetName());
-
- AliDetector::MakeBranch(option,file);
-
- const char *cD = strstr(option,"D");
- const char *cR = strstr(option,"R");
- const char *cH = strstr(option,"H");
-
- if (fPadHits && gAlice->TreeH() && cH) {
- MakeBranchInTree(gAlice->TreeH(),
- branchname, &fPadHits, kBufferSize, file);
- }
-
- if (cD) {
- //
- // one branch for digits per chamber
- //
- Int_t i;
-
- for (i=0; i<AliMUONConstants::NCh() ;i++) {
- sprintf(branchname,"%sDigits%d",GetName(),i+1);
- if (fDchambers && gAlice->TreeD()) {
- MakeBranchInTree(gAlice->TreeD(),
- branchname, &((*fDchambers)[i]), kBufferSize, file);
- printf("Making Branch %s for digits in chamber %d\n",branchname,i+1);
- }
- }
- }
-
- if (cR) {
- //
- // one branch for raw clusters per chamber
- //
- printf("Make Branch - TreeR address %p\n",gAlice->TreeR());
-
- Int_t i;
-
- for (i=0; i<AliMUONConstants::NTrackingCh() ;i++) {
- sprintf(branchname,"%sRawClusters%d",GetName(),i+1);
- if (fRawClusters && gAlice->TreeR()) {
- MakeBranchInTree(gAlice->TreeR(),
- branchname, &((*fRawClusters)[i]), kBufferSize, file);
- printf("Making Branch %s for raw clusters in chamber %d\n",branchname,i+1);
- }
- }
- //
- // one branch for global trigger
- //
- sprintf(branchname,"%sGlobalTrigger",GetName());
- if (fGlobalTrigger && gAlice->TreeR()) {
- MakeBranchInTree(gAlice->TreeR(),
- branchname, &fGlobalTrigger, kBufferSize, file);
- printf("Making Branch %s for Global Trigger\n",branchname);
- }
- //
- // one branch for local trigger
- //
- sprintf(branchname,"%sLocalTrigger",GetName());
- if (fLocalTrigger && gAlice->TreeR()) {
- MakeBranchInTree(gAlice->TreeR(),
- branchname, &fLocalTrigger, kBufferSize, file);
- printf("Making Branch %s for Local Trigger\n",branchname);
- }
- }
-}
-
-//___________________________________________
-void AliMUON::SetTreeAddress()
-{
- // Set branch address for the Hits and Digits Tree.
- char branchname[30];
- AliDetector::SetTreeAddress();
-
- TBranch *branch;
- TTree *treeH = gAlice->TreeH();
- TTree *treeD = gAlice->TreeD();
- TTree *treeR = gAlice->TreeR();
-
- if (treeH) {
- if (fPadHits) {
- branch = treeH->GetBranch("MUONCluster");
- if (branch) branch->SetAddress(&fPadHits);
- }
- }
-
- if (treeD) {
- for (int i=0; i<AliMUONConstants::NCh(); i++) {
- sprintf(branchname,"%sDigits%d",GetName(),i+1);
- if (fDchambers) {
- branch = treeD->GetBranch(branchname);
- if (branch) branch->SetAddress(&((*fDchambers)[i]));
- }
- }
- }
-
- // printf("SetTreeAddress --- treeR address %p \n",treeR);
-
- if (treeR) {
- for (int i=0; i<AliMUONConstants::NTrackingCh(); i++) {
- sprintf(branchname,"%sRawClusters%d",GetName(),i+1);
- if (fRawClusters) {
- branch = treeR->GetBranch(branchname);
- if (branch) branch->SetAddress(&((*fRawClusters)[i]));
- }
- }
-
- if (fLocalTrigger) {
- branch = treeR->GetBranch("MUONLocalTrigger");
- if (branch) branch->SetAddress(&fLocalTrigger);
- }
- if (fGlobalTrigger) {
- branch = treeR->GetBranch("MUONGlobalTrigger");
- if (branch) branch->SetAddress(&fGlobalTrigger);
- }
+ return 9999;
+}
+//__________________________________________________________________
+void AliMUON::SetTreeAddress()
+{
+ GetMUONData()->SetLoader(fLoader);
+ // 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
+ }
}
-}
-//___________________________________________
-void AliMUON::ResetHits()
-{
- // Reset number of clusters and the cluster array for this detector
- AliDetector::ResetHits();
- fNPadHits = 0;
- if (fPadHits) fPadHits->Clear();
-}
-
-//____________________________________________
-void AliMUON::ResetDigits()
-{
- //
- // Reset number of digits and the digits array for this detector
- //
- for ( int i=0;i<AliMUONConstants::NCh();i++ ) {
- //PH if ((*fDchambers)[i]) ((TClonesArray*)(*fDchambers)[i])->Clear();
- if ((*fDchambers)[i]) ((TClonesArray*)fDchambers->At(i))->Clear();
- if (fNdch) fNdch[i]=0;
- }
-}
-//____________________________________________
-void AliMUON::ResetRawClusters()
-{
- //
- // Reset number of raw clusters and the raw clust array for this detector
- //
- for ( int i=0;i<AliMUONConstants::NTrackingCh();i++ ) {
- //PH if ((*fRawClusters)[i]) ((TClonesArray*)(*fRawClusters)[i])->Clear();
- if ((*fRawClusters)[i]) ((TClonesArray*)fRawClusters->At(i))->Clear();
- if (fNrawch) fNrawch[i]=0;
- }
+ fHits = GetMUONData()->Hits(); // Added by Ivana to use the methods FisrtHit, NextHit of AliDetector
}
-//____________________________________________
-void AliMUON::ResetTrigger()
-{
- // Reset Local and Global Trigger
- fNGlobalTrigger = 0;
- if (fGlobalTrigger) fGlobalTrigger->Clear();
- fNLocalTrigger = 0;
- if (fLocalTrigger) fLocalTrigger->Clear();
-}
-
-//____________________________________________
+//____________________________________________________________________
void AliMUON::SetPadSize(Int_t id, Int_t isec, Float_t p1, Float_t p2)
{
// Set the pad size for chamber id and cathode isec
Int_t i=2*(id-1);
- //PH ((AliMUONChamber*) (*fChambers)[i]) ->SetPadSize(isec,p1,p2);
- //PH ((AliMUONChamber*) (*fChambers)[i+1])->SetPadSize(isec,p1,p2);
((AliMUONChamber*) fChambers->At(i)) ->SetPadSize(isec,p1,p2);
((AliMUONChamber*) fChambers->At(i+1))->SetPadSize(isec,p1,p2);
}
// Set Z values for all chambers (tracking and trigger)
// from the array pointed to by "Z"
for (Int_t ch = 0; ch < AliMUONConstants::NCh(); ch++)
- //PH ((AliMUONChamber*) ((*fChambers)[ch]))->SetZ(Z[ch]);
((AliMUONChamber*) fChambers->At(ch))->SetZ(Z[ch]);
return;
}
-
-//___________________________________________
+//_________________________________________________________________
void AliMUON::SetChambersZToDefault()
{
// Set Z values for all chambers (tracking and trigger)
SetChambersZ(AliMUONConstants::DefaultChamberZ());
return;
}
-
-//___________________________________________
+//_________________________________________________________________
void AliMUON::SetChargeSlope(Int_t id, Float_t p1)
{
// Set the inverse charge slope for chamber id
- Int_t i=2*(id-1);
- //PH ((AliMUONChamber*) (*fChambers)[i])->SetChargeSlope(p1);
- //PH ((AliMUONChamber*) (*fChambers)[i+1])->SetChargeSlope(p1);
+ Int_t i=2*(id-1); //PH ((AliMUONChamber*) (*fChambers)[i])->SetSigmaIntegration(p1);
+ //PH ((AliMUONChamber*) (*fChambers)[i+1])->SetSigmaIntegration(p1);
((AliMUONChamber*) fChambers->At(i))->SetChargeSlope(p1);
((AliMUONChamber*) fChambers->At(i+1))->SetChargeSlope(p1);
}
-
-//___________________________________________
+//__________________________________________________________________
void AliMUON::SetChargeSpread(Int_t id, Float_t p1, Float_t p2)
{
// Set sigma of charge spread for chamber id
Int_t i=2*(id-1);
- //PH ((AliMUONChamber*) fChambers->At(i))->SetChargeSpread(p1,p2);
- //PH ((AliMUONChamber*) fChambers->Ati+1])->SetChargeSpread(p1,p2);
((AliMUONChamber*) fChambers->At(i))->SetChargeSpread(p1,p2);
((AliMUONChamber*) fChambers->At(i+1))->SetChargeSpread(p1,p2);
}
-
-//___________________________________________
+//___________________________________________________________________
void AliMUON::SetSigmaIntegration(Int_t id, Float_t p1)
{
// Set integration limits for charge spread
Int_t i=2*(id-1);
- //PH ((AliMUONChamber*) (*fChambers)[i])->SetSigmaIntegration(p1);
- //PH ((AliMUONChamber*) (*fChambers)[i+1])->SetSigmaIntegration(p1);
((AliMUONChamber*) fChambers->At(i))->SetSigmaIntegration(p1);
((AliMUONChamber*) fChambers->At(i+1))->SetSigmaIntegration(p1);
}
-//___________________________________________
+//__________________________________________________________________
void AliMUON::SetMaxAdc(Int_t id, Int_t p1)
{
// Set maximum number for ADCcounts (saturation)
Int_t i=2*(id-1);
- //PH ((AliMUONChamber*) (*fChambers)[i])->SetMaxAdc(p1);
- //PH ((AliMUONChamber*) (*fChambers)[i+1])->SetMaxAdc(p1);
((AliMUONChamber*) fChambers->At(i))->SetMaxAdc(p1);
((AliMUONChamber*) fChambers->At(i+1))->SetMaxAdc(p1);
}
-
-//___________________________________________
+//__________________________________________________________________
void AliMUON::SetMaxStepGas(Float_t p1)
{
// Set stepsize in gas
- fMaxStepGas=p1;
+ fMaxStepGas=p1;
}
-
-//___________________________________________
+//__________________________________________________________________
void AliMUON::SetMaxStepAlu(Float_t p1)
{
// Set step size in Alu
fMaxStepAlu=p1;
}
-
-//___________________________________________
+//__________________________________________________________________
void AliMUON::SetMaxDestepGas(Float_t p1)
{
// Set maximum step size in Gas
fMaxDestepGas=p1;
}
-
-//___________________________________________
+//__________________________________________________________________
void AliMUON::SetMaxDestepAlu(Float_t p1)
{
// Set maximum step size in Alu
- fMaxDestepAlu=p1;
+ fMaxDestepAlu=p1;
}
-//___________________________________________
+//___________________________________________________________________
void AliMUON::SetAcceptance(Bool_t acc, Float_t angmin, Float_t angmax)
{
// Set acceptance cuts
- fAccCut=acc;
- fAccMin=angmin*TMath::Pi()/180;
- fAccMax=angmax*TMath::Pi()/180;
- Int_t ch;
- if (acc) {
- for (Int_t st = 0; st < AliMUONConstants::NCh() / 2; st++) {
- // Loop over 2 chambers in the station
- 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 loop
- } // station loop
- }
+ fAccCut=acc;
+ fAccMin=angmin*TMath::Pi()/180;
+ fAccMax=angmax*TMath::Pi()/180;
+ Int_t ch;
+ if (acc) {
+ for (Int_t st = 0; st < AliMUONConstants::NCh() / 2; st++) {
+ // Loop over 2 chambers in the station
+ 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(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 the segmentation for chamber id cathode isec
- //PH ((AliMUONChamber*) (*fChambers)[id])->SetSegmentationModel(isec, segmentation);
((AliMUONChamber*) fChambers->At(id))->SetSegmentationModel(isec, segmentation);
}
-//___________________________________________
+//____________________________________________________________________
void AliMUON::SetResponseModel(Int_t id, AliMUONResponse *response)
{
// Set the response for chamber id
- //PH ((AliMUONChamber*) (*fChambers)[id])->SetResponseModel(response);
((AliMUONChamber*) fChambers->At(id))->SetResponseModel(response);
}
-
+//____________________________________________________________________
void AliMUON::SetReconstructionModel(Int_t id, AliMUONClusterFinderVS *reconst)
{
// Set ClusterFinder for chamber id
- //PH ((AliMUONChamber*) (*fChambers)[id])->SetReconstructionModel(reconst);
((AliMUONChamber*) fChambers->At(id))->SetReconstructionModel(reconst);
}
-
+//____________________________________________________________________
void AliMUON::SetNsec(Int_t id, Int_t nsec)
{
// Set number of segmented cathods for chamber id
- //PH ((AliMUONChamber*) (*fChambers)[id])->SetNsec(nsec);
((AliMUONChamber*) fChambers->At(id))->SetNsec(nsec);
}
-
-//___________________________________________
+//____________________________________________________________________
+AliDigitizer* AliMUON::CreateDigitizer(AliRunDigitizer* manager) const
+{
+ return new AliMUONDigitizerv2(manager);
+}
+//_____________________________________________________________________
void AliMUON::SDigits2Digits()
{
fMerger->Init();
fMerger->Digitise();
char hname[30];
- sprintf(hname,"TreeD%d",gAlice->GetHeader()->GetEvent());
- gAlice->TreeD()->Write(hname,TObject::kOverwrite);
- gAlice->TreeD()->Reset();
-}
-
-//___________________________________________
-void AliMUON::MakePadHits(Float_t xhit,Float_t yhit, Float_t zhit,
- Float_t eloss, Float_t tof, Int_t idvol)
-{
-//
-// Calls the charge disintegration method of the current chamber and adds
-// the simulated cluster to the root treee
-//
- Int_t clhits[7];
- Float_t newclust[6][500];
- Int_t nnew;
-
-
-//
-// Integrated pulse height on chamber
-
-
- clhits[0]=fNhits+1;
-//
-//
-// if (idvol == 6) printf("\n ->Disintegration %f %f %f", xhit, yhit, eloss );
-
-
- //PH ((AliMUONChamber*) (*fChambers)[idvol])
- ((AliMUONChamber*) fChambers->At(idvol))
- ->DisIntegration(eloss, tof, xhit, yhit, zhit, nnew, newclust);
- Int_t ic=0;
-// if (idvol == 6) printf("\n nnew %d \n", nnew);
-//
-// Add new clusters
- for (Int_t i=0; i<nnew; i++) {
- if (Int_t(newclust[3][i]) > 0) {
- ic++;
-// Cathode plane
- clhits[1] = Int_t(newclust[5][i]);
-// Cluster Charge
- clhits[2] = Int_t(newclust[0][i]);
-// Pad: ix
- clhits[3] = Int_t(newclust[1][i]);
-// Pad: iy
- clhits[4] = Int_t(newclust[2][i]);
-// Pad: charge
- clhits[5] = Int_t(newclust[3][i]);
-// Pad: chamber sector
- clhits[6] = Int_t(newclust[4][i]);
-
- AddPadHit(clhits);
- }
- }
-}
-
-//___________________________________________
-void AliMUON::Trigger(Int_t nev){
+ // sprintf(hname,"TreeD%d",fLoader->GetHeader()->GetEvent());
+ fLoader->TreeD()->Write(hname,TObject::kOverwrite);
+ 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)
+{
+//builds standard getter (AliLoader type)
+//if detector wants to use castomized getter, it must overload this method
+
+ if (GetDebug())
+ 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*/){
// call the Trigger Algorithm and fill TreeR
Int_t singlePlus[3] = {0,0,0};
Int_t singleUndef[3] = {0,0,0};
Int_t pairUnlike[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);
-// add a local trigger in the list
- AddGlobalTrigger(singlePlus, singleMinus, singleUndef, pairUnlike, pairLike);
+
+ // add a local trigger in the list
+ GetMUONData()->AddGlobalTrigger(singlePlus, singleMinus, singleUndef, pairUnlike, pairLike);
Int_t i;
for (Int_t icirc=0; icirc<AliMUONConstants::NTriggerCircuit(); icirc++) {
- if(decision->GetITrigger(icirc)==1) {
- Int_t localtr[7]={0,0,0,0,0,0,0};
- Int_t loLpt[2]={0,0}; Int_t loHpt[2]={0,0}; Int_t loApt[2]={0,0};
- decision->GetLutOutput(icirc, loLpt, loHpt, loApt);
- localtr[0] = icirc;
- localtr[1] = decision->GetStripX11(icirc);
- localtr[2] = decision->GetDev(icirc);
- localtr[3] = decision->GetStripY11(icirc);
- for (i=0; i<2; i++) { // convert the Lut output in 1 digit
- localtr[4] = localtr[4]+Int_t(loLpt[i]*TMath::Power(2,i));
- localtr[5] = localtr[5]+Int_t(loHpt[i]*TMath::Power(2,i));
- localtr[6] = localtr[6]+Int_t(loApt[i]*TMath::Power(2,i));
- }
- AddLocalTrigger(localtr); // add a local trigger in the list
+ if(decision->GetITrigger(icirc)==1) {
+ Int_t localtr[7]={0,0,0,0,0,0,0};
+ Int_t loLpt[2]={0,0}; Int_t loHpt[2]={0,0}; Int_t loApt[2]={0,0};
+ decision->GetLutOutput(icirc, loLpt, loHpt, loApt);
+ localtr[0] = icirc;
+ localtr[1] = decision->GetStripX11(icirc);
+ localtr[2] = decision->GetDev(icirc);
+ localtr[3] = decision->GetStripY11(icirc);
+ for (i=0; i<2; i++) { // convert the Lut output in 1 digit
+ localtr[4] = localtr[4]+Int_t(loLpt[i]*TMath::Power(2,i));
+ localtr[5] = localtr[5]+Int_t(loHpt[i]*TMath::Power(2,i));
+ localtr[6] = localtr[6]+Int_t(loApt[i]*TMath::Power(2,i));
}
+ GetMUONData()->AddLocalTrigger(localtr); // add a local trigger in the list
+ }
}
+
delete decision;
- gAlice->TreeR()->Fill();
- ResetTrigger();
- char hname[30];
- sprintf(hname,"TreeR%d",nev);
- gAlice->TreeR()->Write(hname,TObject::kOverwrite);
- gAlice->TreeR()->Reset();
- printf("\n End of trigger for event %d", nev);
+ // 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\n", nev);
}
-
-//____________________________________________
+//____________________________________________________________________
void AliMUON::Digits2Reco()
{
FindClusters();
Int_t nev = gAlice->GetHeader()->GetEvent();
- gAlice->TreeR()->Fill();
- char hname[30];
- sprintf(hname,"TreeR%d", nev);
- gAlice->TreeR()->Write(hname);
- gAlice->TreeR()->Reset();
- ResetRawClusters();
- printf("\n End of cluster finding for event %d", nev);
+ GetMUONData()->Fill("RC"); //Filling Reconstructed Cluster
+ fLoader->WriteRecPoints("OVERWRITE");
+ GetMUONData()->ResetRawClusters();
+ Info("Digits2Reco","End of cluster finding for event %d", nev);
}
-
+//____________________________________________________________________
void AliMUON::FindClusters()
{
//
dig1 = new TClonesArray("AliMUONDigit",1000);
dig2 = new TClonesArray("AliMUONDigit",1000);
AliMUONDigit *digit;
-//
// Loop on chambers and on cathode planes
//
ResetRawClusters();
+ TClonesArray * muonDigits;
+
for (Int_t ich = 0; ich < 10; ich++) {
//PH AliMUONChamber* iChamber = (AliMUONChamber*) (*fChambers)[ich];
AliMUONChamber* iChamber = (AliMUONChamber*) fChambers->At(ich);
AliMUONClusterFinderVS* rec = iChamber->ReconstructionModel();
- gAlice->ResetDigits();
- gAlice->TreeD()->GetEvent(0);
- TClonesArray *muonDigits = this->DigitsAddress(ich);
+ ResetDigits();
+ GetMUONData()->GetCathode(0);
+ //TClonesArray *
+ muonDigits = GetMUONData()->Digits(ich);
ndig=muonDigits->GetEntriesFast();
- printf("\n 1 Found %d digits in %p %d", ndig, muonDigits,ich);
+ if(fDebug)
+ printf("\n 1 Found %d digits in %p chamber %d", ndig, muonDigits,ich);
TClonesArray &lhits1 = *dig1;
Int_t n = 0;
for (k = 0; k < ndig; k++) {
if (rec->TestTrack(digit->Track(0)))
new(lhits1[n++]) AliMUONDigit(*digit);
}
- gAlice->ResetDigits();
- gAlice->TreeD()->GetEvent(1);
- muonDigits = this->DigitsAddress(ich);
+ 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;
delete dig1;
delete dig2;
}
-
+//______________________________________________________________________
#ifdef never
-void AliMUON::Streamer(TBuffer &R__b)
+void AliMUON::Streamer(TBuffer &R__b)_
{
// Stream an object of class AliMUON.
AliMUONChamber *iChamber;
}
}
#endif
-
+//_______________________________________________________________________
AliMUONPadHit* AliMUON::FirstPad(AliMUONHit* hit, TClonesArray *clusters)
{
-//
+// to be removed
// Initialise the pad iterator
// Return the address of the first padhit for hit
TClonesArray *theClusters = clusters;
return 0;
}
}
-
+//_______________________________________________________________________
AliMUONPadHit* AliMUON::NextPad(TClonesArray *clusters)
{
+ // To be removed
// Get next pad (in iterator)
//
AliMUON::fCurIterPad++;
return 0;
}
}
-
+//_______________________________________________________________________
AliMUONRawCluster *AliMUON::RawCluster(Int_t ichamber, Int_t icathod, Int_t icluster)
{
//
// Return rawcluster (icluster) for chamber ichamber and cathode icathod
// Obsolete ??
- TClonesArray *muonRawCluster = RawClustAddress(ichamber);
+ TClonesArray *muonRawCluster = GetMUONData()->RawClusters(ichamber);
ResetRawClusters();
- TTree *treeR = gAlice->TreeR();
+ TTree *treeR = fLoader->TreeR();
Int_t nent=(Int_t)treeR->GetEntries();
treeR->GetEvent(nent-2+icathod-1);
//treeR->GetEvent(icathod);
return mRaw;
}
-
+//________________________________________________________________________
void AliMUON::SetMerger(AliMUONMerger* merger)
{
// Set pointer to merger
fMerger = merger;
}
-
+//________________________________________________________________________
AliMUONMerger* AliMUON::Merger()
{
// Return pointer to merger
return fMerger;
}
-
-
-
-AliMUON& AliMUON::operator = (const AliMUON& rhs)
+//________________________________________________________________________
+AliMUON& AliMUON::operator = (const AliMUON& /*rhs*/)
{
// copy operator
// dummy version
return *this;
}
-
-////////////////////////////////////////////////////////////////////////
-void AliMUON::MakeBranchInTreeD(TTree *treeD, const char *file)
+//________________________________________________________________________
+void AliMUON::Reconstruct() const
{
- //
- // Create TreeD branches for the MUON.
- //
- const Int_t kBufferSize = 4000;
- char branchname[30];
-
- //
- // one branch for digits per chamber
- //
- for (Int_t i=0; i<AliMUONConstants::NCh() ;i++) {
- sprintf(branchname,"%sDigits%d",GetName(),i+1);
- if (fDchambers && treeD) {
- MakeBranchInTree(treeD,
- branchname, &((*fDchambers)[i]), kBufferSize, file);
- printf("Making Branch %s for digits in chamber %d\n",branchname,i+1);
- }
+// 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 = 0;
+ TClonesArray* recTrigTracksArray = 0;
+
+ //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 = 0;
+ AliMUONTrackParam* trackParam = 0;
+ AliMUONTriggerTrack* recTriggerTrack = 0;
+
+ 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
+ if (recTrigTracksArray)
+ recTriggerTrack = (AliMUONTriggerTrack*) recTrigTracksArray->First();
+ if (recTriggerTrack) 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 = 0;
+ if (recTracksArray)
+ 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();
+}