// AliITStrackerANN header file. // Class definition for the Neural Tracking implementation // for the ALICE ITS stand-alone. // Author: A. Pulvirenti // Email : alberto.pulvirenti@ct.infn.it #ifndef ALIITSTRACKERANN_H #define ALIITSTRACKERANN_H #include "AliITStrackerV2.h" class AliITSgeom; class TArrayI; class AliITStrackerANN : public AliITStrackerV2 { public: /* Constructors */ AliITStrackerANN() : AliITStrackerV2() { /* does nothing */ }; AliITStrackerANN(const AliITSgeom *geom, Int_t msglev = 0); AliITStrackerANN(const AliITStrackerANN &n) : AliITStrackerV2((AliITStrackerV2&)n) { /* nothing */ } AliITStrackerANN& operator=(const AliITStrackerANN& /*arg*/) { return *this; } /* Destructor */ // virtual ~AliITStrackerANN(); /********************************************* >> AliITSnode << ---------------- An ITS point in the global reference frame. *********************************************/ class AliITSnode : public TObject { public: AliITSnode(); ~AliITSnode(); AliITSnode(const AliITSnode &n) : TObject((TObject&)n) { /* nothing */ } AliITSnode& operator=(const AliITSnode& /*arg*/) { return *this; } /* (NODE) Function to extract layer info from cluster index */ Int_t GetLayer() const {Int_t lay = (fClusterRef & 0xf0000000) >> 28; return lay;} /* (NODE) Getter and Setter for the 'fUsed' flag */ Bool_t IsUsed() const {return fUsed;} void Use() {fUsed = kTRUE;} /* (NODE) Geometrical functions */ Double_t GetR2() const {return TMath::Sqrt(GetR2sq());} // xy radius Double_t GetR3() const {return TMath::Sqrt(GetR3sq());} // xyz radius Double_t GetR2sq() const {return fX*fX+fY*fY;} // xy radius^2 Double_t GetR3sq() const {return GetR2sq()+fZ*fZ;} // xyz radius^2 Double_t GetPhi() const; Double_t GetTheta() const {return TMath::ATan2(GetR2(),fZ);} // polar angle Double_t GetError(Option_t *opt); // errors on coords /* Data members references */ Double_t& X() {return fX;} Double_t& Y() {return fY;} Double_t& Z() {return fZ;} Double_t& ErrX2() {return fEX2;} Double_t& ErrY2() {return fEY2;} Double_t& ErrZ2() {return fEZ2;} Int_t& ClusterRef() {return fClusterRef;} TObjArray*& Matches() {return fMatches;} TObjArray*& InnerOf() {return fInnerOf;} TObjArray*& OuterOf() {return fOuterOf;} AliITSnode*& Next() {return fNext;} AliITSnode*& Prev() {return fPrev;} private: Double_t fX; // X in global reference system Double_t fY; // Y in global reference system Double_t fZ; // Z in global reference system Double_t fEX2; // X error in global reference system Double_t fEY2; // Y error in global reference system Double_t fEZ2; // Z error in global reference system Bool_t fUsed; // usage flag Int_t fClusterRef; // reference index for related cluster TObjArray *fMatches; //! array of well-matched cluster indexes TObjArray *fInnerOf; //! array of neurons starting from *this TObjArray *fOuterOf; //! array of neurons entering *this AliITSnode *fNext; //! pointer to the next node in the found track AliITSnode *fPrev; //! pointer to the previous node in the found track }; /* End of AliITSnode class */ /*************************************** >> AliITSneuron << ------------------ A single unit in the neural network. ***************************************/ class AliITSneuron : public TObject { public: /* (NEURON) Constructor: alocates the sequenced units array */ AliITSneuron() : fUsed(0), fActivation(0.), fInner(0), fOuter(0), fGain(0) {fGain = new TObjArray;} AliITSneuron(AliITSnode *inner, AliITSnode *outer, Double_t minAct, Double_t maxAct); AliITSneuron(const AliITSneuron &n) : TObject((TObject&)n) { /* nothing */ } AliITSneuron& operator=(const AliITSneuron& /*arg*/) { return *this; } /* (NEURON) Destructor: frees memory from dynamic allocated objects */ virtual ~AliITSneuron() { fInner = fOuter = 0; fGain->SetOwner(kFALSE); fGain->Clear(); delete fGain; } /* Compute neural activation from the network */ Double_t Activate(Double_t temperature); /* Data members references */ Int_t& Used() {return fUsed;} Double_t& Activation() {return fActivation;} AliITSnode*& Inner() {return fInner;} AliITSnode*& Outer() {return fOuter;} TObjArray*& Gain() {return fGain;} private: Int_t fUsed; // utility flag Double_t fActivation; // Activation value AliITSnode *fInner; //! inner point AliITSnode *fOuter; //! outer point TObjArray *fGain; //! list of sequenced units }; /* End of NEURON class */ /************************************************** >> AliITSlink << ---------------- A synaptic connected unit in the neural network. **************************************************/ class AliITSlink : public TObject { public: AliITSlink() {fWeight = 0.0; fLinked = 0;} AliITSlink(Double_t w, AliITSneuron *n) : fWeight(w), fLinked(n) { } virtual ~AliITSlink() {fLinked = 0;} AliITSlink(const AliITSlink &n) : TObject((TObject&)n) { /* nothing */ } AliITSlink& operator=(const AliITSlink& /*arg*/) { return *this; } /* contribution */ Double_t Contribution() {return fLinked->Activation() * fWeight;} private: Double_t fWeight; // Weight value AliITSneuron *fLinked; //! Connected neuron }; /* End of AliITSlink class */ /************************************** >> AliITStrackANN << ---------------- A track found by the neural network. **************************************/ class AliITStrackANN : public TObject { public: AliITStrackANN(Int_t dim = 0); AliITStrackANN(const AliITStrackANN &n) : TObject((TObject&)n) { /* nothing */ } AliITStrackANN& operator=(const AliITStrackANN& /*arg*/) { return *this; } Double_t& XCenter() {return fXCenter;} Double_t& YCenter() {return fYCenter;} Double_t& Radius() {return fRadius;} Double_t& Curv() {return fCurv;} Double_t& ImpactParameterTrans() {return fDTrans;} Double_t& ImpactParameterLong() {return fDLong;} Double_t& TanLambda() {return fTanLambda;} Double_t& Phi() {return fPhi;} AliITSnode* operator[](Int_t i) const {return ((i>=0&&i=0&&i=0&&i