00001
00002
00003 #include <iostream>
00004 #include <fstream>
00005 #include <vector>
00006 #include <set>
00007
00008 using namespace std;
00009
00010 struct L2wResult2009 {
00011 enum {mySizeChar=8};
00012 unsigned char seedEt;
00013 unsigned char clusterEt;
00014 unsigned char seedEtaBin;
00015 unsigned char seedPhiBin;
00016
00017 unsigned char trigger;
00018 unsigned char dum1,dum2,dum3;
00019 };
00020
00021
00022 void electron_histogram_maker(const char* file_list="ctest.list",const char* skimfile="electronskimfile.root")
00023 {
00024 gROOT->Macro("LoadLogger.C");
00025 gROOT->Macro("loadMuDst.C");
00026 gSystem->Load("StTpcDb");
00027 gSystem->Load("StDaqLib");
00028 gSystem->Load("StDetectorDbMaker");
00029 gSystem->Load("St_db_Maker");
00030 gSystem->Load("StDbUtilities");
00031 gSystem->Load("StEmcRawMaker");
00032 gSystem->Load("StMcEvent");
00033 gSystem->Load("StMcEventMaker");
00034 gSystem->Load("StEmcSimulatorMaker");
00035 gSystem->Load("StEmcADCtoEMaker");
00036 gSystem->Load("StEpcMaker");
00037 gSystem->Load("StDbBroker");
00038 gSystem->Load("StEmcUtil");
00039 gSystem->Load("StAssociationMaker");
00040
00041 gSystem->Load("StTriggerUtilities");
00042 gSystem->Load("StEmcOfflineCalibrationMaker");
00043 cout<<"input filelist: "<<file_list<<endl;
00044 cout<<"skimmed tree: "<<skimfile<<endl;
00045
00046
00047 char file[300];
00048 TChain* calib_tree = new TChain("calibTree");
00049 ifstream filelist(file_list);
00050 while(1){
00051 filelist >> file;
00052 if(!filelist.good()) break;
00053 cout<<file<<endl;
00054 calib_tree->Add(file);
00055 }
00056
00057 StEmcGeom* geom = StEmcGeom::instance("bemc");
00058
00059
00060 vector<unsigned int> htTriggers;
00061 htTriggers.push_back(240530);
00062 htTriggers.push_back(240530);
00063 htTriggers.push_back(240550);
00064 htTriggers.push_back(240560);
00065 htTriggers.push_back(240570);
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077 StEmcOfflineCalibrationEvent* myEvent = new StEmcOfflineCalibrationEvent();
00078 calib_tree->SetBranchAddress("event_branch",&myEvent);
00079 StEmcOfflineCalibrationCluster* cluster = new StEmcOfflineCalibrationCluster();
00080 StEmcOfflineCalibrationTrack* track = new StEmcOfflineCalibrationTrack();
00081 StEmcOfflineCalibrationTrack* dumtrack = new StEmcOfflineCalibrationTrack();
00082
00083 TFile* skim_file = new TFile(skimfile,"RECREATE");
00084 TTree *electron_tree = new TTree("skimTree","electron tracks");
00085 electron_tree->Branch("clusters",&cluster);
00086
00087 TH2F* dEdxvsp = new TH2F("dEdxvsp","",100,0.0,10.0,100,0.0,1e-5);
00088
00089
00090 set<int> track_towers;
00091 set<int> excluded_towers;
00092
00093 unsigned int nAccept = 0;
00094 unsigned int nGoodEvents = 0;
00095 unsigned int nentries = calib_tree->GetEntries();
00096 int ngoodhit = 0;
00097 int nplt10 = 0;
00098 int nnosis = 0;
00099 int nfinal = 0;
00100 int nbsmdgood = 0;
00101 int nnottrig = 0;
00102 int nfidu = 0;
00103 int nenterexit = 0;
00104 for(unsigned int i=0; i<nentries; i++){
00105 if(i%1000000 == 0) cout<<"processing "<<i<<" of "<<nentries<<endl;
00106
00107 calib_tree->GetEntry(i);
00108
00109
00110 if(TMath::Abs(myEvent->vz[0]) > 60.) continue;
00111
00112
00113
00114
00115 const int BEMCW_off=20;
00116
00117
00118
00119
00120 float trigeta = -999;
00121 float trigphi = -999;
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134 int nht = 0;
00135 int yht = 0;
00136 for(unsigned int h = 0; h < myEvent->triggerIds.size(); h++){
00137 int isht = 0;
00138 for(unsigned int f = 0; f < htTriggers.size(); f++){
00139 if(htTriggers[f] == myEvent->triggerIds[h])isht = 1;
00140 }
00141 if(!isht)nht = 1;
00142 if(isht)yht = 1;
00143
00144 }
00145
00146
00147
00148 track_towers.clear();
00149 excluded_towers.clear();
00150
00151 for(int j=0; j<myEvent->tracks->GetEntries(); j++){
00152 track = (StEmcOfflineCalibrationTrack*)myEvent->tracks->At(j);
00153 int id = track->tower_id[0];
00154
00155 if(track_towers.find(id) != track_towers.end()){
00156 excluded_towers.insert(id);
00157 }
00158 else{
00159 track_towers.insert(id);
00160 }
00161 }
00162
00163
00164 for(int j=0; j<myEvent->tracks->GetEntries(); j++){
00165 track = (StEmcOfflineCalibrationTrack*)myEvent->tracks->At(j);
00166 dEdxvsp->Fill(track->p,track->dEdx);
00167 if(j==0) nGoodEvents++;
00168
00169 double dR = TMath::Sqrt(track->deta*track->deta + track->dphi*track->dphi);
00170
00171
00172 float squarefid = 0.03/TMath::Sqrt(2.0);
00173
00174
00175 if(track->p < 1.5) continue;
00176 if(track->p > 20.) continue;
00177 ngoodhit++;
00178 if(track->tower_status[0] != 1) continue;
00179 nenterexit++;
00180
00181 if(track->nHits < 10) continue;
00182 nplt10++;
00183
00184
00185 if(excluded_towers.find(track->tower_id[0]) != excluded_towers.end()) continue;
00186 nfidu++;
00187 if((track->tower_adc[0] - track->tower_pedestal[0]) < 1.5 * track->tower_pedestal_rms[0])continue;
00188 nnottrig++;
00189
00190 if(track->dEdx < 3.0e-6)continue;
00191 nbsmdgood++;
00192
00193
00194
00195
00196
00197 cluster->centralTrack = *track;
00198
00199 float toweta,towphi;
00200 geom->getEtaPhi(track->tower_id[0],toweta,towphi);
00201
00202 int tr = 0;
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214 track->htTrig = yht + tr;
00215 track->nonhtTrig = nht;
00216
00217
00218 for (int k = 1; k < 9; k++)
00219 {
00220 if(track_towers.find(track->tower_id[k]) != track_towers.end())
00221 {
00222 for(int q = 0; q < myEvent->tracks->GetEntries(); q++)
00223 {
00224 if(q == j)continue;
00225 dumtrack = (StEmcOfflineCalibrationTrack*)myEvent->tracks->At(q);
00226 if(dumtrack->tower_id[0] == track->tower_id[k])
00227 {
00228 cluster->addTrack(dumtrack);
00229
00230
00231 }
00232 }
00233 }
00234 }
00235 nAccept++;
00236 electron_tree->Fill();
00237 track->Clear();
00238 cluster->Clear();
00239
00240 }
00241 myEvent->Clear();
00242 }
00243
00244 cout<<"found "<<nGoodEvents<<" events with at least one good track"<<endl;
00245 cout<<"accepted "<<nAccept<<" electrons"<<endl;
00246
00247
00248
00249
00250
00251
00252
00253
00254 skim_file->cd();
00255 skim_file->Write();
00256 skim_file->Close();
00257 }