00001 #include "mEmcRecoModuleRealYear4.h"
00002
00003 #include "emcDataStorageMap.h"
00004 #include "emcDBMS.h"
00005 #include "emcModuleHelper.h"
00006 #include "emcNodeHelper.h"
00007 #include "mEmcGeometryModule.h"
00008 #include "PHIODataNode.h"
00009 #include "PHTimeStamp.h"
00010 #include "recoConsts.h"
00011
00012 #include "emcClusterContainerv5.h"
00013 #include "emcTowerContainerv3.h"
00014 #include "mEmcCalibratorModulev2.h"
00015 #include "mEmcClusterizerv0.h"
00016
00017 #include <iostream>
00018 #include <memory>
00019 #include <vector>
00020 #include <cassert>
00021
00022 using namespace std;
00023
00024 const float mEmcRecoModuleRealYear4::fgTowerThresholdPbSc = 0.010;
00025 const float mEmcRecoModuleRealYear4::fgTowerThresholdPbGl = 0.014;
00026 const float mEmcRecoModuleRealYear4::fgMinClusterEnergyPbSc = 0.015;
00027 const float mEmcRecoModuleRealYear4::fgMinClusterEnergyPbGl = 0.060;
00028
00029
00030 mEmcRecoModuleRealYear4::mEmcRecoModuleRealYear4(const PHFlag& flags)
00031 {
00032 const recoConsts* rc = dynamic_cast<const recoConsts*>(&flags);
00033
00034 assert(rc!=0);
00035
00036 if ( flags.FlagExist("SIMULATIONFLAG") )
00037 {
00038 assert(flags.get_IntFlag("SIMULATIONFLAG")==0);
00039 }
00040
00041
00042 fTimeStamp = new PHTimeStamp(rc->get_TimeStamp());
00043
00044 PHTimeStamp y1999(1999,1,1,0,0,0);
00045
00046 assert( *fTimeStamp > y1999 );
00047
00048 fStartupMessage << "TimeStamp=" << *fTimeStamp << std::endl;
00049
00050
00051
00052
00053 fConstantGains = false;
00054 fSectors = "emcal";
00055 fDataStorageMap = 0;
00056
00057 if ( flags.FlagExist("EMCCONSTANTGAINS") )
00058 {
00059 if ( flags.get_IntFlag("EMCCONSTANTGAINS") == 1 )
00060 {
00061 fConstantGains = true;
00062
00063 fStartupMessage
00064 << "Will not use variability of PbSc gains"
00065 << endl;
00066 }
00067 }
00068
00069 if ( flags.FlagExist("EMCSECTORS") )
00070 {
00071 fSectors = flags.get_CharFlag("EMCSECTORS");
00072
00073 fStartupMessage
00074 << "Considering emcal sectors : "
00075 << fSectors
00076 << endl;
00077 }
00078
00079 if ( flags.FlagExist("EMCDATASOURCE") &&
00080 flags.FlagExist("EMCEXPERTDATASOURCES"))
00081 {
00082 std::cout << PHWHERE << "<WARNING> Both EMCDATASOURCE and "
00083 << "EMCEXPERTDATASOURCES flags are present. "
00084 << "Second one will superceede first one."
00085 << std::endl;
00086 }
00087
00088 if ( flags.FlagExist("EMCDATASOURCE") &&
00089 !flags.FlagExist("EMCEXPERTDATASOURCES"))
00090 {
00091 emcManageable::EStorage ds =
00092 emcManageable::GetStorage(flags.get_CharFlag("EMCDATASOURCE"));
00093 if ( ds == emcManageable::kNone )
00094 {
00095 cerr << "mEmcRecoModuleRealYear4::mEmcRecoModuleRealYear4 : "
00096 << "Flag EMCDATASOURCE=" << flags.get_CharFlag("EMCDATASOURCE")
00097 << " is not valid. Using default="
00098 << emcManageable::GetStorageName(emcDBMS::get())
00099 << endl;
00100 }
00101 else
00102 {
00103 fDataStorageMap = new emcDataStorageMap(ds);
00104 }
00105
00106 fStartupMessage << "Using "
00107 << emcManageable::GetStorageName(fDataStorageMap->storage())
00108 << " as calibration data source"
00109 << endl;
00110 }
00111
00112 if (!fDataStorageMap)
00113 {
00114 fDataStorageMap = new emcDataStorageMap(emcDBMS::get());
00115 }
00116
00117 if ( flags.FlagExist("EMCEXPERTDATASOURCES") )
00118 {
00119 fDataStorageMap->parse(flags.get_CharFlag("EMCEXPERTDATASOURCES"));
00120 fStartupMessage << "Calibration data will be read from "
00121 << emcManageable::GetStorageName(fDataStorageMap->storage())
00122 << " except the following ones : "
00123 << endl
00124 << (*fDataStorageMap)
00125 << endl;
00126 }
00127
00128
00129 fModules = new emcModuleHelper;
00130
00131 fRunNumber = flags.get_IntFlag("RUNNUMBER");
00132
00133 fDstNodeName = "DST";
00134 }
00135
00136
00137 mEmcRecoModuleRealYear4::~mEmcRecoModuleRealYear4()
00138 {
00139 delete fTimeStamp;
00140 delete fModules;
00141 delete fDataStorageMap;
00142 }
00143
00144
00145 int
00146 mEmcRecoModuleRealYear4::ana(PHCompositeNode* topNode)
00147 {
00148 return fModules->event(topNode);
00149 }
00150
00151
00152 void
00153 mEmcRecoModuleRealYear4::createNodeTree(PHCompositeNode* topNode)
00154 {
00155 vector<string> nodes;
00156
00157 nodes.push_back("EMC");
00158 nodes.push_back("PAR");
00159
00160 emcNodeHelper nh;
00161
00162 for ( size_t i = 0; i < nodes.size(); ++i )
00163 {
00164 bool ok = nh.makeCompositeNode(topNode,nodes[i].c_str(),"-p");
00165 assert(ok==true);
00166 }
00167 }
00168
00169
00170 int
00171 mEmcRecoModuleRealYear4::end(PHCompositeNode* topNode)
00172 {
00173 return 0;
00174 }
00175
00176
00177 void
00178 mEmcRecoModuleRealYear4::identify(ostream& os) const
00179 {
00180 os << "mEmcRecoModuleRealYear4::identify" << endl;
00181 }
00182
00183
00184 int
00185 mEmcRecoModuleRealYear4::setup(PHCompositeNode* topNode)
00186 {
00187 emcNodeHelper nh;
00188
00189 PHCompositeNode* dstNode =
00190 nh.findCompositeNode(topNode,fDstNodeName.c_str());
00191
00192 if (!dstNode)
00193 {
00194
00195 fDstNodeName = "UDST";
00196 dstNode = nh.findCompositeNode(topNode,fDstNodeName.c_str());
00197 if ( !dstNode )
00198 {
00199 cerr << "<E> mEmcRecoModuleRealYear4::setup : no DST or "
00200 << " uDST node found !"
00201 << endl;
00202 return -1;
00203 }
00204 }
00205
00206 createNodeTree(topNode);
00207
00208
00209 setup_calibrator(topNode);
00210
00211
00212 setup_clustering(topNode);
00213
00214 std::cout << std::string(80,'*') << "\n"
00215 << "EMCAL Reconstruction is using mEmcRecoModuleRealYear4\n"
00216 << fStartupMessage.str()
00217 << "Sequence of modules used :"
00218 << std::endl;
00219
00220 fModules->print();
00221
00222 std::cout << std::string(80,'*') << std::endl;
00223 return 0;
00224 }
00225
00226
00227 void
00228 mEmcRecoModuleRealYear4::setup_calibrator(PHCompositeNode* topNode)
00229 {
00230
00231
00232
00233 emcNodeHelper nh;
00234
00235 PHCompositeNode* dstNode = nh.findCompositeNode(topNode,"DST");
00236
00237 nh.addObject<emcTowerContainerv3>(dstNode,"emcTowerContainer");
00238
00239 assert(fTimeStamp!=0);
00240
00241 mEmcCalibratorModulev2* calib =
00242 new mEmcCalibratorModulev2(fRunNumber,*fTimeStamp,fConstantGains,
00243 *fDataStorageMap,fSectors.c_str());
00244
00245 fModules->add(calib);
00246 }
00247
00248
00249 void
00250 mEmcRecoModuleRealYear4::setup_clustering(PHCompositeNode* topNode)
00251 {
00252 emcNodeHelper nh;
00253
00254 PHCompositeNode* dstNode =
00255 nh.findCompositeNode(topNode,fDstNodeName.c_str());
00256
00257 nh.addObject<emcClusterContainerv5>(dstNode,"emcClusterContainer");
00258
00259 PHCompositeNode* parNode = nh.findCompositeNode(topNode,"PAR");
00260
00261 mEmcGeometryModule* geometryModule =
00262 new mEmcGeometryModule(mEmcGeometryModule::kReal);
00263 PHIODataNode<TObject>* geometryNode
00264 = new PHIODataNode<TObject>(geometryModule, "mEmcGeometry");
00265 parNode->addNode(geometryNode);
00266
00267 mEmcClusterizerv0* clusterizer = new mEmcClusterizerv0(geometryModule);
00268
00269 clusterizer->SetTowerThresholdPbSc(fgTowerThresholdPbSc);
00270 clusterizer->SetTowerThresholdPbGl(fgTowerThresholdPbGl);
00271 clusterizer->SetMinClusterEnergyPbSc(fgMinClusterEnergyPbSc);
00272 clusterizer->SetMinClusterEnergyPbGl(fgMinClusterEnergyPbGl);
00273
00274
00275 recoConsts *rc = recoConsts::instance();
00276 if (rc->get_IntFlag("RUNEMCCLUSTERING",1)==1)
00277 {
00278 fModules->add(clusterizer);
00279 }
00280 else
00281 {
00282 cout << PHWHERE << " WARNING::User has disabled EMC clustering!!!" << endl;
00283 }
00284 }
00285
00286
00287
00288
00289
00290