45 #include "FairRootManager.h"
46 #include "FairRunAna.h"
47 #include "FairRuntimeDb.h"
48 #include "TClonesArray.h"
100 FairRootManager* ioman = FairRootManager::Instance();
102 cout <<
"-E- PndEmcPhiBumpSplitter::Init: "
103 <<
"RootManager not instantiated!" << endl;
112 fDigiArray =
dynamic_cast<TClonesArray *
> (ioman->GetObject(
"EmcDigi"));
114 cout <<
"-W- PndEmcPhiBumpSplitter::Init: "
115 <<
"No PndEmcDigi array!" << endl;
119 fClusterArray =
dynamic_cast<TClonesArray *
> (ioman->GetObject(
"EmcCluster"));
121 cout <<
"-W- PndEmcPhiBumpSplitter::Init: "
122 <<
"No PndEmcCluster array!" << endl;
128 cout<<
"Lilo cluster position method"<<endl;
138 cout <<
"-I- PndEmcPhiBumpSplitter: Intialization successfull" << endl;
159 for (Int_t iCluster = 0; iCluster < nClusters; iCluster++){
163 const Int_t TotNumOfHitPhi = 160;
165 std::vector<double> phi_bump(TotNumOfHitPhi,0);
167 Int_t digiSize = theCluster->
DigiList().size();
168 std::vector<Int_t> digiList = theCluster->
DigiList();
169 for (Int_t i_digi = 0; i_digi<digiSize; ++i_digi)
174 if (
fabs(emcDigiPhi)<=180 ) {
175 Int_t iEmcDigiPhi = int( (emcDigiPhi + 180.) * TotNumOfHitPhi / 360. );
176 phi_bump.at(iEmcDigiPhi) += emcDigiEnergy;
180 std::vector<double> vPhiList;
181 std::vector<double> vDepoEnergyList;
182 std::vector<int> vGapSizeList;
185 for (Int_t i_phi=0; i_phi < TotNumOfHitPhi; ++i_phi) {
186 Double_t BinValue = phi_bump.at(i_phi);
189 vPhiList.push_back(-180. + ((0.5+i_phi)*360./TotNumOfHitPhi));
190 vDepoEnergyList.push_back(BinValue);
191 vGapSizeList.push_back(i_phi - i_phi_prev );
197 Int_t StartIndex = 0;
198 for (
size_t i = 0;
i < vGapSizeList.size();
i++)
200 if (vGapSizeList.at(
i) > vGapSizeList.at(StartIndex)) StartIndex =
i;
204 std::rotate(vDepoEnergyList.begin(),vDepoEnergyList.begin()+StartIndex,vDepoEnergyList.end());
205 vDepoEnergyList.push_back(0);
206 vDepoEnergyList.push_back(0);
207 std::rotate(vDepoEnergyList.begin(),vDepoEnergyList.begin()+(vDepoEnergyList.size()-1),vDepoEnergyList.end());
209 std::rotate(vPhiList.begin(),vPhiList.begin()+StartIndex,vPhiList.end());
210 vPhiList.push_back(0);
211 vPhiList.push_back(0);
212 std::rotate(vPhiList.begin(),vPhiList.begin()+(vPhiList.size()-1),vPhiList.end());
215 std::vector<int> ValleyType;
216 std::vector<double> Weight;
219 ValleyType.push_back(0);
220 for (
size_t n_sel = 1; n_sel < vDepoEnergyList.size()-1; n_sel++)
222 if(vDepoEnergyList.at(n_sel-1) > vDepoEnergyList.at(n_sel) &&
223 vDepoEnergyList.at(n_sel) < vDepoEnergyList.at(n_sel+1) ) {
224 ValleyType.push_back(1);
225 Weight.push_back(_Weight);
228 _Weight += vDepoEnergyList.at(n_sel);
229 ValleyType.push_back(0);
232 Weight.push_back(_Weight);
235 std::vector<double> enePhiBump, phiPhiBump;
238 for (
size_t n_sel = 1; n_sel < vDepoEnergyList.size()-1; n_sel++)
240 if (ValleyType.at(n_sel) == 1 || n_sel == vDepoEnergyList.size()-2)
244 const double _eneRightEdge = vDepoEnergyList.at(ValleyIndex)*(Weight.at(iWeight)/(Weight.at(iWeight)+Weight.at(iWeight-1)));
245 double _enePhiBump = _eneRightEdge;
246 double _phiPhiBump = vPhiList.at(ValleyIndex)*_eneRightEdge;
247 for(
size_t p = ValleyIndex+1;
p < n_sel;
p++) {
248 _enePhiBump += vDepoEnergyList.at(
p);
249 _phiPhiBump += vPhiList.at(
p)*vDepoEnergyList.at(
p);
251 const double _eneLeftEdge = vDepoEnergyList.at(n_sel)*(Weight.at(iWeight)/(Weight.at(iWeight)+Weight.at(iWeight+1) ));
252 _enePhiBump += _eneLeftEdge;
253 _phiPhiBump += vPhiList.at(n_sel)*_eneLeftEdge;
254 _phiPhiBump /= _enePhiBump;
255 enePhiBump.push_back(_enePhiBump);
256 phiPhiBump.push_back(_phiPhiBump);
261 TVector3 posClust = theCluster->
position();
262 for (
size_t i_phibump=0; i_phibump<enePhiBump.size(); ++i_phibump) {
265 theNewPhiBump->SetLink(FairLink(
"EmcCluster", iCluster));
266 theNewPhiBump->
SetEnergy(enePhiBump.at(i_phibump));
267 theNewPhiBump->SetTimeStamp(theCluster->GetTimeStamp());
268 theNewPhiBump->SetTimeStampError(theCluster->GetTimeStampError());
270 posPhiBump.SetMagThetaPhi(posClust.Mag(),posClust.Theta(),phiPhiBump.at(i_phibump)*TMath::DegToRad());
286 Int_t size = clref.GetEntriesFast();
297 cout<<
"================================================="<<endl;
298 cout<<
"PndEmcPhiBumpSplitter::FinishTask"<<endl;
299 cout<<
"================================================="<<endl;
305 FairRun*
run = FairRun::Instance();
306 if ( ! run ) Fatal(
"SetParContainers",
"No analysis run");
308 FairRuntimeDb* db = run->GetRuntimeDb();
309 if ( ! db ) Fatal(
"SetParContainers",
"No runtime database");
void SetEnergy(Double_t en)
virtual void MadeFrom(Int_t clusterIndex)
splits clusters based on local maxima in the Phi direction for use with Bremstrahlung correction...
virtual void SetParContainers()
TClonesArray * fClusterArray
virtual Double_t GetEnergy() const
represents the reconstructed hit of one emc crystal
void SetPersistency(Bool_t val=kTRUE)
const std::vector< Int_t > & DigiList() const
virtual void Exec(Option_t *opt)
Runs the task.
TClonesArray * fDigiArray
std::vector< Double_t > fClusterPosParam
Double_t GetOffsetParmB()
Double_t GetOffsetParmC()
TVector3 position() const
virtual void FinishTask()
Called at end of task.
parameter set of Emc digitisation
virtual ~PndEmcPhiBumpSplitter()
Double_t GetOffsetParmA()
friend F32vec4 fabs(const F32vec4 &a)
a cluster (group of neighboring crystals) of hit emc crystals
TVector3 rotate(TVector3 vec, TGeoRotation *rotma)
void SetPosition(TVector3 pos)
PndEmcPhiBumpSplitter(Int_t verbose=0)
Text_t * GetEmcClusterPosMethod()
static PndEmcStructure * Instance()
TClonesArray * fPhiBumpArray
static PndEmcMapper * Instance()
represents a reconstructed (splitted) emc cluster
virtual InitStatus Init()
Init Task.
Parameter set for Emc Reco.
PndEmcBump * AddPhiBump()
Adds a new PndEmcBump to fPhiBumpArray and returns it.