00001 #include "StEmcOfflineCalibrationElectronAnalyzer.h"
00002 #include "TMath.h"
00003 #include "TChain.h"
00004 #include "TNtuple.h"
00005 #include "StEmcUtil/geometry/StEmcGeom.h"
00006 #include "StEmcUtil/database/StBemcTablesWriter.h"
00007 #include "TFile.h"
00008 #include "TH2.h"
00009 #include "StEmcOfflineCalibrationEvent.h"
00010 #include <set>
00011 #include <map>
00012 #include <vector>
00013 #include "TMath.h"
00014 ClassImp(StEmcOfflineCalibrationElectronAnalyzer)
00015
00016 void StEmcOfflineCalibrationElectronAnalyzer::analyze(TChain* calib_tree, char* skimfile,char* dbTime)
00017 {
00018
00019 TFile* skim_file = new TFile(skimfile,"RECREATE");
00020 TNtuple *ntuple = new TNtuple("nt","electron ntuple","p:teta:tphi:dedx:np:id:rn:eta:energy:r:vz:ht:en3x3:enHN:nTracks");
00021
00022 StEmcGeom* emcgeom = StEmcGeom::instance("bemc");
00023 StBemcTablesWriter* bemctables = new StBemcTablesWriter();
00024 bemctables->loadTables(dbTime,"ofl");
00025
00026
00027 StEmcOfflineCalibrationEvent* myEvent = new StEmcOfflineCalibrationEvent();
00028 calib_tree->SetBranchAddress("event_branch",&myEvent);
00029 StEmcOfflineCalibrationTrack* track = new StEmcOfflineCalibrationTrack();
00030
00031
00032 set<int> track_towers;
00033 set<int> excluded_towers;
00034
00035 unsigned int nAccept = 0;
00036 unsigned int nGoodEvents = 0;
00037 unsigned int nentries = calib_tree->GetEntries();
00038 for(unsigned int i=0; i<nentries; i++){
00039 if(i > 1000)break;
00040 if(i%100000 == 0) cout<<"processing "<<i<<" of "<<nentries<<endl;
00041
00042 calib_tree->GetEntry(i);
00043
00044
00045 float vz = myEvent->vz[0];
00046 int rn = (int)myEvent->run;
00047 int ht = 0;
00048 int oht = 0;
00049 int nht = 0;
00050
00051 for(unsigned int k = 0; k < myEvent->triggerIds.size(); k++){
00052 int isht = 0;
00053 cout<<i<<" "<<myEvent->triggerIds[k]<<endl;
00054 for(unsigned int l = 0; l < HTtrigs.size(); l++){
00055 cout<<i<<" "<<HTtrigs[l]<<" "<<myEvent->triggerResult[HTtrigs[l]]<<" "<<myEvent->towersAboveThreshold[HTtrigs[l]].size()<<endl;
00056 if((int)myEvent->triggerIds[k] == HTtrigs[l]){
00057 isht = 1;
00058 break;
00059 }
00060 }
00061 if(isht)ht=1;
00062 else nht=1;
00063 }
00064
00065 if(ht == 1)oht=1;
00066 map<unsigned int, vector< pair<int,int> > >tws;
00067 tws = myEvent->towersAboveThreshold;
00068 map<unsigned int, vector< pair<int,int> > >::iterator miter;
00069 for(miter = tws.begin(); miter != tws.end(); miter++){
00070 vector< pair<int,int> > vs;
00071 vector< pair<int,int> >::iterator viter;
00072 vs = (*miter).second;
00073 unsigned int trigID = (*miter).first;
00074
00075 for(viter = vs.begin(); viter != vs.end(); viter++){
00076 cout<<trigID<<" "<<(*viter).first<<" "<<(*viter).second<<endl;
00077 }
00078 }
00079
00080
00081
00082
00083
00084
00085
00086 track_towers.clear();
00087 excluded_towers.clear();
00088
00089 for(int j=0; j<myEvent->tracks->GetEntries(); j++){
00090 track = (StEmcOfflineCalibrationTrack*)myEvent->tracks->At(j);
00091 int id = track->tower_id[0];
00092
00093 if(track_towers.find(id) != track_towers.end()){
00094 excluded_towers.insert(id);
00095 }
00096 else{
00097 track_towers.insert(id);
00098 }
00099 }
00100
00101
00102 for(int j=0; j<myEvent->tracks->GetEntries(); j++){
00103 track = (StEmcOfflineCalibrationTrack*)myEvent->tracks->At(j);
00104
00105 if(j==0) nGoodEvents++;
00106
00107 double dR = TMath::Sqrt(track->deta*track->deta + track->dphi*track->dphi);
00108
00109
00110
00111
00112
00113 float p = track->p;
00114 float teta = track->track.pseudoRapidity();
00115 float tphi = track->track.phi();
00116 float np = track->nHits;
00117 float dedx = track->dEdx;
00118 float energy = (track->tower_adc[0]-track->tower_pedestal[0])*bemctables->calib(1,track->tower_id[0]);
00119 if(energy < 0)energy = 0;
00120 if(track->tower_status[0] != 1) continue;
00121 float id = track->tower_id[0];
00122 float idx = track->tower_id_exit;
00123 if(id!=idx)continue;
00124 float eta;
00125 emcgeom->getEta((int)id,eta);
00126 if(excluded_towers.find(track->tower_id[0]) != excluded_towers.end()) continue;
00127
00128
00129
00130
00131 float nnt = 0;
00132 float en3x3 = energy;
00133 float enHN = 0;
00134 if(track->nSigmaElectron > -2.){
00135
00136
00137 for (int k = 1; k < 9; k++)
00138 {
00139 float tenergy = (track->tower_adc[k]-track->tower_pedestal[k])*bemctables->calib(1,track->tower_id[k]);
00140 if(tenergy > 0)en3x3+=tenergy;
00141 if(tenergy > enHN)enHN = tenergy;
00142 if(track_towers.find(track->tower_id[k]) != track_towers.end())
00143 {
00144 nnt++;
00145 }
00146 }
00147 ntuple->Fill(p,teta,tphi,dedx,np,id,rn,eta,energy,dR,vz,oht,en3x3,enHN,nnt);
00148 nAccept++;
00149 track->Clear();
00150 }
00151 }
00152 cout<<i<<" "<<nAccept<<endl;
00153 myEvent->Clear();
00154 }
00155 skim_file->cd();
00156 skim_file->Write();
00157 skim_file->Close();
00158
00159 }
00160
00161
00162 void StEmcOfflineCalibrationElectronAnalyzer::analyzeTree(TChain* calib_tree, char* skimfile,char* dbTime)
00163 {
00164
00165 StEmcGeom* emcgeom = StEmcGeom::instance("bemc");
00166 StBemcTablesWriter* bemctables = new StBemcTablesWriter();
00167 bemctables->loadTables(dbTime,"ofl");
00168
00169 StEmcOfflineCalibrationEvent* myEvent = new StEmcOfflineCalibrationEvent();
00170 calib_tree->SetBranchAddress("event_branch",&myEvent);
00171 StEmcOfflineCalibrationCluster* cluster = new StEmcOfflineCalibrationCluster();
00172 StEmcOfflineCalibrationTrack* track = new StEmcOfflineCalibrationTrack();
00173 StEmcOfflineCalibrationTrack* dumtrack = new StEmcOfflineCalibrationTrack();
00174
00175 TFile* skim_file = new TFile(skimfile,"RECREATE");
00176
00177 TTree *electron_tree = new TTree("skimTree","electron tracks");
00178 electron_tree->Branch("clusters",&cluster);
00179
00180 TH2F* dEdxvsp = new TH2F("dEdxvsp","",100,0.0,10.0,100,0.0,1e-5);
00181
00182
00183 set<int> track_towers;
00184 set<int> excluded_towers;
00185
00186 unsigned int nAccept = 0;
00187 unsigned int nGoodEvents = 0;
00188 unsigned int nentries = calib_tree->GetEntries();
00189 int ngoodhit = 0;
00190 int nplt10 = 0;
00191 int nnosis = 0;
00192 int nfinal = 0;
00193 int nbsmdgood = 0;
00194 int nnottrig = 0;
00195 int nfidu = 0;
00196 int nenterexit = 0;
00197 for(unsigned int i=0; i<nentries; i++){
00198 if(i%1000000 == 0) cout<<"processing "<<i<<" of "<<nentries<<endl;
00199
00200 calib_tree->GetEntry(i);
00201
00202
00203 if(TMath::Abs(myEvent->vz[0]) > 60.) continue;
00204
00205 int nht = 0;
00206 int yht = 0;
00207 for(unsigned int h = 0; h < myEvent->triggerIds.size(); h++){
00208 int isht = 0;
00209 for(unsigned int f = 0; f < HTtrigs.size(); f++){
00210 if(HTtrigs[f] == (int)myEvent->triggerIds[h])isht = 1;
00211 }
00212 if(!isht)nht = 1;
00213 if(isht)yht = 1;
00214 }
00215
00216 vector<int> HTtowers;
00217
00218 if(yht){
00219 map<unsigned int, vector< pair<int,int> > >tws;
00220 tws = myEvent->towersAboveThreshold;
00221 map<unsigned int, vector< pair<int,int> > >::iterator miter;
00222 for(miter = tws.begin(); miter != tws.end(); miter++){
00223 vector< pair<int,int> > vs;
00224 vector< pair<int,int> >::iterator viter;
00225 vs = (*miter).second;
00226 unsigned int trigID = (*miter).first;
00227
00228 for(viter = vs.begin(); viter != vs.end(); viter++){
00229 HTtowers.push_back((*viter).first);
00230
00231 }
00232 }
00233 }
00234
00235 track_towers.clear();
00236 excluded_towers.clear();
00237
00238 for(int j=0; j<myEvent->tracks->GetEntries(); j++){
00239 track = (StEmcOfflineCalibrationTrack*)myEvent->tracks->At(j);
00240 int id = track->tower_id[0];
00241
00242 if(track_towers.find(id) != track_towers.end()){
00243 excluded_towers.insert(id);
00244 }
00245 else{
00246 track_towers.insert(id);
00247 }
00248 }
00249
00250
00251 for(int j=0; j<myEvent->tracks->GetEntries(); j++){
00252 track = (StEmcOfflineCalibrationTrack*)myEvent->tracks->At(j);
00253 dEdxvsp->Fill(track->p,track->dEdx);
00254 if(j==0) nGoodEvents++;
00255 if(myEvent->ranking[track->vertexIndex] < 0)continue;
00256 double dR = TMath::Sqrt(track->deta*track->deta + track->dphi*track->dphi);
00257 float squarefid = 0.03/TMath::Sqrt(2.0);
00258
00259 if(track->p < 1.5) continue;
00260 if(track->p > 20.) continue;
00261 ngoodhit++;
00262 if(track->tower_status[0] != 1) continue;
00263 nenterexit++;
00264
00265 if(track->nHits < 10) continue;
00266 nplt10++;
00267
00268
00269 if(excluded_towers.find(track->tower_id[0]) != excluded_towers.end()) continue;
00270 nfidu++;
00271 if((track->tower_adc[0] - track->tower_pedestal[0]) < 1.5 * track->tower_pedestal_rms[0])continue;
00272 nnottrig++;
00273
00274 if(track->dEdx < 3.0e-6)continue;
00275 nbsmdgood++;
00276
00277
00278
00279
00280
00281 cluster->centralTrack = *track;
00282
00283 float toweta,towphi;
00284 emcgeom->getEtaPhi(track->tower_id[0],toweta,towphi);
00285
00286 int tr = 0;
00287 if(yht){
00288 for(int ttt = 0; ttt < (int)HTtowers.size(); ttt++){
00289 float trigeta,trigphi;
00290 emcgeom->getEtaPhi(HTtowers[ttt],trigeta,trigphi);
00291 float tcdeta = fabs(toweta - trigeta);
00292 float tcdphi = fabs(towphi - trigphi);
00293 if(tcdphi > TMath::Pi())tcdphi = 2*TMath::Pi() - tcdphi;
00294 float tcdR = sqrt(pow(tcdeta,2) + pow(tcdphi,2));
00295 if(tcdR < 0.7)tr = 1;
00296
00297 }
00298 }
00299
00300
00301 track->htTrig = yht + tr;
00302 track->nonhtTrig = nht;
00303
00304
00305 for (int k = 1; k < 9; k++)
00306 {
00307 if(track_towers.find(track->tower_id[k]) != track_towers.end())
00308 {
00309 for(int q = 0; q < myEvent->tracks->GetEntries(); q++)
00310 {
00311 if(q == j)continue;
00312 dumtrack = (StEmcOfflineCalibrationTrack*)myEvent->tracks->At(q);
00313 if(dumtrack->tower_id[0] == track->tower_id[k])
00314 {
00315 cluster->addTrack(dumtrack);
00316
00317
00318 }
00319 }
00320 }
00321 }
00322 nAccept++;
00323 electron_tree->Fill();
00324
00325 track->Clear();
00326 cluster->Clear();
00327
00328 }
00329 myEvent->Clear();
00330 }
00331
00332 cout<<"found "<<nGoodEvents<<" events with at least one good track"<<endl;
00333 cout<<"accepted "<<nAccept<<" electrons"<<endl;
00334
00335
00336
00337
00338
00339
00340
00341
00342 skim_file->cd();
00343 skim_file->Write();
00344 skim_file->Close();
00345
00346 }