00001
00008
00009
00010
00011
00012
00013
00014 #ifndef STV0TOFCORRECTION_H
00015 #define STV0TOFCORRECTION_H
00016
00017 #include <stdio.h>
00018 #include <stdarg.h>
00019
00020 #include <TROOT.h>
00021 #include "TMath.h"
00022 #include "StPhysicalHelixD.hh"
00023 #include "StarClassLibrary/StLorentzVectorD.hh"
00024 #include "StarClassLibrary/StThreeVectorD.hh"
00025 #include <iostream>
00026 #include "TVirtualStreamerInfo.h"
00027
00028 #include <vector>
00029
00031
00032 template < class T, class container = std::vector<T> > class StInlineContainer : public container {
00033 private:
00034 Int_t NrArgs;
00035 StInlineContainer<T>* pContainer;
00036
00037 public:
00038 StInlineContainer() { NrArgs = 0; pContainer = NULL; }
00039 virtual ~StInlineContainer() {}
00040 explicit StInlineContainer(const T vec) : container(1,vec) { }
00041
00042 StInlineContainer<T> operator()(const T vec) {
00043 NrArgs++;
00044 pContainer->setNrArgs(NrArgs);
00045 pContainer->push_back(vec);
00046 return *pContainer;
00047 }
00049 void setNrArgs(Int_t c) { NrArgs = c; }
00051 Int_t getNrArgs() { return NrArgs; }
00053 void setPointer2Container(StInlineContainer<T>* p) { pContainer = p; }
00054 };
00055
00057
00058 class StV0TofCorrection {
00059 private:
00061 inline Float_t calcTof(StLorentzVectorD trackAB, Float_t PathAB);
00063 Float_t calcPathCorr(StPhysicalHelixD helixA, StThreeVectorD vectorAB, StThreeVectorD vectorTof) ;
00065 Float_t calcPathOnHelixToPoint(StPhysicalHelixD helixA, StThreeVectorD space_vec) ;
00067 inline Bool_t inputOk();
00069 inline Bool_t cutOnMass2(Float_t Mass2, Int_t pidnr);
00071 void setNrDecays(Int_t n) { NrDecays = n; }
00072
00073 Float_t clight;
00074 Bool_t cleared, cleared2;
00075
00076 Int_t NrDecays;
00077 StInlineContainer<StThreeVectorD>* Vectors3D;
00078 StInlineContainer<StLorentzVectorD>* tracks;
00079
00080 public:
00081 StV0TofCorrection() ;
00082 virtual ~StV0TofCorrection() ;
00083
00085 StInlineContainer<StThreeVectorD> setVectors3D(const StThreeVectorD vec) {
00086 if ( cleared ) {
00087 Vectors3D = new StInlineContainer<StThreeVectorD>;
00088 }
00089 else {
00090 Error("StV0TofCorrection::setVectors3D","Make sure to call clearContainers() function every time a correction of a particle is done! Otherwise you're using the same container over and over again!");
00091 }
00092 Vectors3D->setNrArgs(0);
00093 Vectors3D->setPointer2Container(Vectors3D);
00094 cleared = kFALSE;
00095 return (*Vectors3D)(vec);
00096 }
00097
00099 StInlineContainer<StLorentzVectorD> setMotherTracks(const StLorentzVectorD tr) {
00100 if ( cleared2 ) {
00101 tracks = new StInlineContainer<StLorentzVectorD>;
00102 tracks->setNrArgs(0);
00103 tracks->setPointer2Container(tracks);
00104 cleared2 = kFALSE;
00105 return (*tracks)(tr);
00106 }
00107 else {
00108 Error("StV0TofCorrection::setMotherTracks","Again: Don't forget clearContainers()!");
00109 return (*tracks);
00110 }
00111 }
00112
00114 Bool_t correctBeta(StPhysicalHelixD helixA, Float_t TofA, Float_t& BetaCorr, Float_t MomentumA = -999., Int_t pidnr = -1) ;
00115
00117 void clearContainers() {
00118 delete Vectors3D; delete tracks;
00119 Vectors3D = NULL; tracks = NULL;
00120 cleared = kTRUE; cleared2 = kTRUE;
00121 }
00122
00123 ClassDef(StV0TofCorrection,1)
00124
00125 };
00126
00127
00128 #endif
00129