00001
00002
00003
00004
00005 #include <StThreeVector.hh>
00006 #include <StPrimaryVertex.h>
00007 #include "StEEmcPool/StEEmcA2EMaker/StEEmcA2EMaker.h"
00008
00009 #include "StEvent.h"
00010 #include "StMessMgr.h"
00011
00012 #include "StEEmcFilterMaker.h"
00013
00014 ClassImp(StEEmcFilterMaker)
00015
00016
00017
00018 StEEmcFilterMaker::StEEmcFilterMaker(const char *name):StMaker(name){
00019 par_Et_thres=-1;
00020 par_Z0_vert=-9999;
00021 par_delZ_vert=0.;
00022 myMode=kUnknown;
00023 }
00024
00025
00026
00027
00029 StEEmcFilterMaker::~StEEmcFilterMaker(){
00030
00031
00032 }
00033
00034
00035
00036
00037
00038 Int_t StEEmcFilterMaker::Init(){
00039 SetAttr(".Privilege",1);
00040
00041 mGeomE = new EEmcGeomSimple();
00042
00043 mH0=new TH1F("mH0","Event counter",5,0.5,5.5);
00044 nInpEve=nRecVert=nZverOK=nAccEve=0;
00045 LOG_INFO << Form("Init ee-filter cuts: ET>%.2f Zvert=%.2f +/-%.2f (cm)", par_Et_thres, par_Z0_vert, par_delZ_vert)<<endm;
00046 if(myMode==kUseFixedVertex) LOG_INFO << Form(" FIXED vertex mode is activated")<<endl;
00047 assert (myMode!=kUnknown);
00048 return StMaker::Init();
00049 }
00050
00051
00052
00053 Int_t StEEmcFilterMaker::FinishRun(int runumber){
00054 LOG_INFO << Form("Finish cuts: ET>%.2f Zvert=%.2f +/-%.2f (cm) fixVertexMode=%d", par_Et_thres, par_Z0_vert, par_delZ_vert,myMode)<<endm;
00055 LOG_INFO << Form("%s::Finish run=%d nInp=%d,nRecVer=%d, nZverOK=%d nAcc=%d",GetName(),runumber,nInpEve,nRecVert,nZverOK,nAccEve) << endm;
00056 return kStOK;
00057 };
00058
00059
00060
00061
00062 Int_t StEEmcFilterMaker::Make(){
00063 LOG_INFO << Form("in::Make inp=%d,nVer=%d, nZverOK=%d nAcc=%d",nInpEve,nRecVert,nZverOK,nAccEve) << endm;
00064 nInpEve++;
00065 mH0->Fill(1);
00066 StEvent* mEvent = (StEvent*)GetInputDS("StEvent");
00067 assert(mEvent);
00068 Float_t vertexPosZ =par_Z0_vert ;
00069 if(myMode==kUseRecoVertex) {
00070 int nV=mEvent->numberOfPrimaryVertices();
00071 if(nV<=0) return kStSKIP;
00072 int iv=0;
00073 nRecVert++;
00074 mH0->Fill(2);
00075 StPrimaryVertex*V=mEvent->primaryVertex(iv);
00076 assert(V);
00077 StThreeVectorF r=V->position();
00078 vertexPosZ = r.z();
00079 if(fabs(vertexPosZ - par_Z0_vert)> par_delZ_vert) return kStSKIP;
00080 LOG_INFO << Form("eveID=%d nPrimVert=%d zVert=%.2f\n", mEvent->id(),nV, vertexPosZ);
00081 }
00082
00083 nZverOK++;
00084 mH0->Fill(3);
00085 StEEmcA2EMaker *a2eMK=(StEEmcA2EMaker *)GetMaker("EE_A2E");
00086 assert(a2eMK);
00087 StEEmcTower highTow = a2eMK->hightower(0);
00088
00089 Float_t highTEt = highTow.et();
00090 LOG_INFO << Form("eveID=%d highTEt=%.2f\n", mEvent->id(),highTEt);
00091
00092 Float_t triggerPatchEt;
00093 Int_t triggerConditionReturn = triggerCondition(vertexPosZ,&highTow,triggerPatchEt);
00094
00095
00096 if(triggerConditionReturn != 1) {
00097 printf("janKill-%d Me### eve=%d zVer=%.2f highT_et=%.3f TP_ET=%.3f\n",myMode,nInpEve,vertexPosZ, highTEt,triggerPatchEt);
00098 return kStSKIP;
00099 }
00100
00101 nAccEve++;
00102 mH0->Fill(4);
00103
00104 printf("janKeep-%d Me### eve=%d zVer=%.2f highT_et=%.3f TP_ET=%.3f\n",myMode,nInpEve,vertexPosZ, highTEt,triggerPatchEt);
00105
00106
00107 return kStOK;
00108 }
00109
00110
00111 Int_t StEEmcFilterMaker::triggerCondition( Float_t vertexPosZ, StEEmcTower *highTow, Float_t &patchEt)
00112 {
00113
00114
00115 Float_t eemcPatchEt = transverseNRG(vertexPosZ,highTow);
00116 Int_t Nneigh = highTow->numberOfNeighbors();
00117 for(int Nn=0; Nn < Nneigh; Nn++)
00118 {
00119 StEEmcTower neighHighTow = highTow->neighbor(Nn);
00120 Float_t neighEemcPatchEt = transverseNRG(vertexPosZ,&neighHighTow);
00121 eemcPatchEt += neighEemcPatchEt;
00122 }
00123
00124 patchEt = eemcPatchEt;
00125
00126 if(eemcPatchEt < par_Et_thres) return 0;
00127
00128 return 1;
00129
00130 }
00131
00132
00133 Float_t StEEmcFilterMaker::transverseNRG(Float_t vertexPosZ, StEEmcTower *tower)
00134 {
00135
00136
00137
00138 TVector3 towVector = mGeomE->getTowerCenter(tower->sector(),tower->subsector(),tower->etabin());
00139
00140 Float_t xNew = towVector.x() - (288.2 - 279.54)*(towVector.x()/288.2);
00141 Float_t yNew = towVector.y() - (288.2 - 279.54)*(towVector.y()/288.2);
00142
00143 TVector3 *eventTowVector = new TVector3(0,0,0);
00144 eventTowVector->SetXYZ(xNew,yNew,(279.54 - vertexPosZ));
00145
00146
00147
00148 Float_t newTheta = eventTowVector->Theta();
00149
00150 Float_t factor = sin(newTheta);
00151 if(factor > 1.0 || factor < 0.0)
00152 {
00153 return -1.0;
00154 }
00155
00156 Float_t energy = tower->energy();
00157
00158 Float_t transverseEnergy = energy*factor;
00159
00160 return transverseEnergy;
00161 }
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175