Skip to content
Snippets Groups Projects
Analysis.cxx 10.3 KiB
Newer Older
adrien-matta's avatar
adrien-matta committed
#include "Analysis.h"

int main(int argc, char** argv){
  // command line parsing
  NPOptionManager* myOptionManager = NPOptionManager::getInstance(argc,argv);

  // Instantiate RootInput
  string runToReadfileName = myOptionManager->GetRunToReadFile();
  RootInput:: getInstance("RunToTreat.txt");
  TChain* Chain = RootInput:: getInstance()->GetChain();
  // if input files are not given, use those from TAsciiFile
  if (myOptionManager->IsDefault("DetectorConfiguration")) {
    string name = RootInput::getInstance()->DumpAsciiFile("DetectorConfiguration");
    myOptionManager->SetDetectorFile(name);
  }

  if (myOptionManager->IsDefault("EventGenerator")) {
    string name = RootInput::getInstance()->DumpAsciiFile("EventGenerator");
    myOptionManager->SetReactionFile(name);
  }

  // get input files from NPOptionManager
  string detectorfileName    = myOptionManager->GetDetectorFile();
  string OutputfileName      = myOptionManager->GetOutputFile();

  // Instantiate RootOutput
  RootOutput::getInstance("Analysis/"+OutputfileName, "ResultTree");
  // RootOutput::getInstance()->GetFile()->SetCompressionLevel(0);
  // Instantiate the detector using a file
  NPA::DetectorManager* myDetector = new DetectorManager();
  myDetector->ReadConfigurationFile(detectorfileName);
  // Attach new branch
  InitOutputBranch();
  InitInputBranch();

  //	Instantiate the Reaction
  NPL::Reaction*  myReaction = new Reaction ;
  myReaction	->	ReadConfigurationFile(myOptionManager->GetReactionFile());

  ////////////////////////////////////////////////////////
  // Get pointer to the different detector

  TMust2Physics* M2  = (TMust2Physics*) myDetector -> GetDetector("MUST2");
  GaspardTracker* GD = (GaspardTracker*)  myDetector -> GetDetector("GASPARD");

  // Beam Energy
  double BeamEnergy = 4.0* 74; // AMEV

  // intermediate variable
  TRandom3 Rand = TRandom3();
  int DetectorNumber = 0 ;
  double ThetaNormalTarget = 0 ;
  double ThetaM2Surface = 0; 
  double X_M2 = 0 ;
  double Y_M2 = 0 ;
  double Z_M2 = 0 ;
  double Si_E_M2 = 0 ;
  double CsI_E_M2 = 0 ; 
  double Energy = 0;
  double E_M2 = 0;
  double Si_X_M2 = 0;
  double Si_Y_M2 = 0;
  double ZTarget = 0;
  double TargetThickness = 9*micrometer;

  double ThetaGDSurface = 0; 
  double X_GD = 0 ;
  double Y_GD = 0 ;
  double Z_GD = 0 ;
  double Si_E_GD = 0 ;
  double E_GD = 0;
  double Si_X_GD = 0;
  double Si_Y_GD = 0;
 
  
  // Get number of events to treat
  cout << endl << "///////// Starting Analysis ///////// "<< endl;
  int nentries = Chain->GetEntries();
  cout << " Number of Event to be treated : " << nentries << endl;
  clock_t begin = clock();
  clock_t end = begin;
  cout.precision(5);
  //////////////////////////////////////////////////////////////////////////////
  // main loop on entries //
  for (int i = 0 ; i < nentries; i++) {
    if (i%10000 == 0 && i!=0)  {
      end = clock();
      long double TimeElapsed = (long double) (end-begin) / CLOCKS_PER_SEC;
      double percent = (double)i/nentries;
      double TimeToWait = (TimeElapsed/percent) - TimeElapsed;       
      cout  << "                                                      "<< flush;
      cout  << "\r Progression:" 
        << percent*100 << " % \t | \t Remaining time : ~" 
        <<  TimeToWait <<"s |  Analysis Rate : "
        << (double) i/TimeElapsed << flush;
    }
    else if (i == nentries-1)  cout << "\r Progression:" << " 100% " <<endl;
    // Get the raw Data
    Chain -> GetEntry(i);
    // Clear previous Event
    myDetector->ClearEventPhysics();
    // Build the current event
    myDetector->BuildPhysicalEvent();
    // Reinitiate calculated variable
    ReInitValue();
    
    // Get the Init information on beam position and energy
    // and apply by hand the experimental resolution
    // This is because the beam diagnosis are not simulated
    // PPAC position resolution on target is assumed to be 1mm
    double XTarget = 0;
    double YTarget = 0;
    TVector3 BeamDirection = TVector3(0,0,1);

    // Beam energy is measured using F3 and F2 plastic TOF
    BeamEnergy = BeamCD2.Slow(BeamEnergy,TargetThickness/2.,0);
    myReaction->SetBeamEnergy(BeamEnergy);

    //////////////////////////// LOOP on MUST2 //////////////////
    for(unsigned int countMust2 = 0 ; countMust2 < M2->Si_E.size() ; countMust2++){
      /************************************************/
      //Part 0 : Get the usefull Data
      // MUST2
      int X = M2->Si_X[countMust2];
      int Y = M2->Si_Y[countMust2];
      int TelescopeNumber = M2->TelescopeNumber[countMust2];
      Si_X_M2 = X ;
      Si_Y_M2 = Y ;

      /************************************************/
      // Part 1 : Impact Angle
      ThetaM2Surface = 0;
      ThetaNormalTarget = 0;
      if(XTarget>-1000 && YTarget>-1000){
        TVector3 BeamImpact(XTarget,YTarget,0);
        TVector3 HitDirection = M2 -> GetPositionOfInteraction(countMust2) - BeamImpact ;
        ThetaLab = HitDirection.Angle( BeamDirection );

        ThetaM2Surface = HitDirection.Angle(- M2 -> GetTelescopeNormal(countMust2) );
        ThetaNormalTarget = HitDirection.Angle( TVector3(0,0,1) ) ;
        X_M2 = M2 -> GetPositionOfInteraction(countMust2).X() ;
        Y_M2 = M2 -> GetPositionOfInteraction(countMust2).Y() ;
        Z_M2 = M2 -> GetPositionOfInteraction(countMust2).Z() ;
      }

      else{
        BeamDirection = TVector3(-1000,-1000,-1000);
        ThetaM2Surface    = -1000  ;
        ThetaNormalTarget = -1000  ;
      }

      /************************************************/

      /************************************************/
      // Part 2 : Impact Energy
      Energy = ELab = 0;
      Si_E_M2 = M2->Si_E[countMust2];
      CsI_E_M2= M2->CsI_E[countMust2];

      // if CsI
      if(CsI_E_M2>0 ){
        // The energy in CsI is calculate form dE/dx Table because 
        // 20um resolution is poor
        Energy = 
          LightSi.EvaluateEnergyFromDeltaE(Si_E_M2,300*micrometer,
              ThetaM2Surface, 0.01*MeV, 
              450.*MeV,0.001*MeV ,1000);
        E_M2=CsI_E_M2;
      }

      else
        Energy = Si_E_M2;

      E_M2 += Si_E_M2;

      // Evaluate energy using the thickness 
      ELab = LightAl.EvaluateInitialEnergy( Energy ,0.4*micrometer , ThetaM2Surface); 
      // Target Correction
      ELab   = LightCD2.EvaluateInitialEnergy( ELab ,TargetThickness/2., ThetaNormalTarget);
      /************************************************/

      /************************************************/
      // Part 3 : Excitation Energy Calculation
      Ex = myReaction -> ReconstructRelativistic( ELab , ThetaLab );
      ThetaLab=ThetaLab/deg;
      /************************************************/

      /************************************************/
      // Part 4 : Theta CM Calculation
      ThetaCM  = myReaction -> EnergyLabToThetaCM( ELab , 0)/deg;
      /************************************************/
    }//end loop MUST2
    
    ////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////
    //////////////////////////// LOOP on GASPARD //////////////////
    if(GD->GetEnergyDeposit()>0){
      /************************************************/
      // Part 1 : Impact Angle
      ThetaGDSurface = 0;
      ThetaNormalTarget = 0;
      if(XTarget>-1000 && YTarget>-1000){
        TVector3 BeamImpact(XTarget,YTarget,0);
        TVector3 HitDirection = GD -> GetPositionOfInteraction() - BeamImpact ;
        ThetaLab = HitDirection.Angle( BeamDirection );

        ThetaGDSurface = HitDirection.Angle( TVector3(0,0,1) ) ;
        ThetaNormalTarget = HitDirection.Angle( TVector3(0,0,1) ) ;
        X_GD = GD -> GetPositionOfInteraction().X() ;
        Y_GD = GD -> GetPositionOfInteraction().Y() ;
        Z_GD = GD -> GetPositionOfInteraction().Z() ;
      }

      else{
        BeamDirection = TVector3(-1000,-1000,-1000);
        ThetaGDSurface    = -1000  ;
        ThetaNormalTarget = -1000  ;
      }

      /************************************************/

      /************************************************/
      // Part 2 : Impact Energy
      Energy = ELab = 0;
      Energy = GD->GetEnergyDeposit();
      
      ELab = LightAl.EvaluateInitialEnergy( Energy ,0.4*micrometer , ThetaGDSurface); 
      // Target Correction
      ELab   = LightCD2.EvaluateInitialEnergy( ELab ,TargetThickness/2., ThetaNormalTarget);
      /************************************************/

      /************************************************/
      // Part 3 : Excitation Energy Calculation
      Ex = myReaction -> ReconstructRelativistic( ELab , ThetaLab );
      if(Ex!=Ex){
        cout << ELab << " " << ThetaLab << " " << Ex<< endl;
      }
      ThetaLab=ThetaLab/deg;
      /************************************************/

      /************************************************/
      // Part 4 : Theta CM Calculation
      ThetaCM  = myReaction -> EnergyLabToThetaCM( ELab , 0)/deg;
      /************************************************/
    }//end loop GASPARD

    if(ELab>0)
      RootOutput::getInstance()->GetTree()->Fill();
   }// loop over events

  cout << "A total of " << nentries << " event has been annalysed " << endl ;

  RootOutput::getInstance()->Destroy();
  RootInput::getInstance()->Destroy();
  NPOptionManager::getInstance()->Destroy();
  /////////////////////////////////////////////////////////////////////////////
  return 0 ;
}

////////////////////////////////////////////////////////////////////////////////
void InitOutputBranch() {
  RootOutput::getInstance()->GetTree()->Branch("Ex",&Ex,"Ex/D");
  RootOutput::getInstance()->GetTree()->Branch("ELab",&ELab,"ELab/D");
  RootOutput::getInstance()->GetTree()->Branch("ThetaLab",&ThetaLab,"ThetaLab/D");
  RootOutput::getInstance()->GetTree()->Branch("ThetaCM",&ThetaCM,"ThetaCM/D");
}

////////////////////////////////////////////////////////////////////////////////
void InitInputBranch(){
  RootInput:: getInstance()->GetChain()->SetBranchAddress("InitialConditions",&Init );
  RootInput:: getInstance()->GetChain()->SetBranchStatus("InitialConditions",true );
  RootInput:: getInstance()->GetChain()->SetBranchStatus("fIC_*",true );
}
////////////////////////////////////////////////////////////////////////////////     
void ReInitValue(){
  Ex = -1000 ;
  ELab = -1000;
  ThetaLab = -1000;
  ThetaCM = -1000;
}


////////////////////////////////////////////////////////////////////////////////