// system include files
#include <memory>

// user include files
#include "FWCore/Framework/interface/Frameworkfwd.h"
#include "FWCore/Framework/interface/EDAnalyzer.h"
#include "FWCore/Framework/interface/Event.h"
#include "FWCore/Framework/interface/EventSetup.h"
#include "FWCore/Framework/interface/ESHandle.h"
#include "FWCore/Framework/interface/MakerMacros.h"
#include "FWCore/ServiceRegistry/interface/Service.h"

#include "CondCore/DBCommon/interface/DBWriter.h"
#include "CondCore/DBCommon/interface/DBSession.h"
#include "CondCore/DBCommon/interface/Exception.h"
#include "CondCore/DBCommon/interface/ServiceLoader.h"
#include "CondCore/DBCommon/interface/ConnectMode.h"
#include "CondCore/DBCommon/interface/MessageLevel.h"
#include "CondCore/IOVService/interface/IOV.h"
#include "CondCore/MetaDataService/interface/MetaData.h"
#include "FWCore/Framework/interface/IOVSyncValue.h"
#include "SealKernel/Service.h"
#include "POOLCore/POOLContext.h"
#include "SealKernel/Context.h"

#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
#include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"
#include "Geometry/CommonTopologies/interface/StripTopology.h"

#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include "CondFormats/DataRecord/interface/SiStripFedCablingRcd.h"
#include "CondFormats/SiStripObjects/interface/SiStripFedCabling.h"
#include "CondFormats/SiStripObjects/interface/FedChannelConnection.h"
#include "CalibFormats/SiStripObjects/interface/SiStripFecCabling.h"
// clhep
#include "CLHEP/Random/RandFlat.h"

#include "Geometry/TrackerGeometryBuilder/interface/StripGeomDetType.h"
#include "Geometry/TrackerGeometryBuilder/interface/StripGeomDetUnit.h"
#include "DataFormats/FEDRawData/interface/FEDNumbering.h"

#include "FWCore/MessageLogger/interface/MessageLogger.h"

#include "CommonTools/TrackerMap/interface/TmModule.h"
#include "CommonTools/TrackerMap/interface/TrackerMap.h"

using namespace std;
using namespace edm;

class SiStripFedCablingAnalyzer : public edm::EDAnalyzer {
   public:
      explicit SiStripFedCablingAnalyzer( const edm::ParameterSet& );
      ~SiStripFedCablingAnalyzer();
      virtual void analyze( const edm::Event&, const edm::EventSetup& );
   private:
	int nev;
    TrackerMap * tkMap;
};

SiStripFedCablingAnalyzer::SiStripFedCablingAnalyzer( const edm::ParameterSet& iConfig )
{ //now do what ever initialization is needed
  ::putenv("CORAL_AUTH_USER=me");
  ::putenv("CORAL_AUTH_PASSWORD=mypass"); 

	nev=0;
}

SiStripFedCablingAnalyzer::~SiStripFedCablingAnalyzer(){
tkMap->print();
}

void SiStripFedCablingAnalyzer::analyze( const edm::Event& iEvent, const edm::EventSetup& iSetup ) {
  edm::ESHandle<SiStripFedCabling> tkFed;
  std::cout<<"SiStripFedCablingAnalyzer::analyze --- "<<endl;
  iSetup.get<SiStripFedCablingRcd>().get(tkFed);
  
  const vector<unsigned short> feds = tkFed->feds();
  cout<<"SiStripFedCabling has "<< feds.size()<<" active FEDS"<<endl;
  
  
  if(nev==0){tkMap = new TrackerMap("Number of feds per module");}
  
  for(vector<unsigned short>::const_iterator ifed = feds.begin();ifed<feds.end();ifed++){

    int red = ((float)rand())/RAND_MAX*256.0;
    int green =((float)rand())/RAND_MAX*256.0;
    int blue =((float)rand())/RAND_MAX*256.0;

    const std::vector<FedChannelConnection> theconn = tkFed->connections( *ifed );
    for(std::vector<FedChannelConnection>::const_iterator iconn = theconn.begin();iconn<theconn.end();iconn++){
       
      //cout << "detid="<< iconn->detId() << "number of APV pairs for associated module="<< iconn->nApvPairs()<<endl;
      TmModule *mod = IdModuleMap::imoduleMap[iconn->detId()];
      if(mod!=0){
	tkMap->fillc(iconn->detId(), red, green , blue);
	tkMap->setText(iconn->detId(),"this module has feds");
      }else std::cout <<"Module not found"<<std::endl;
    }
  }
  nev++;
  
}

//define this as a plug-in
DEFINE_FWK_MODULE(SiStripFedCablingAnalyzer)
