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.